From b38321c1cfb2377ea9b9f8a4661ca630fad74c99 Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen <aardappel@gmail.com> Date: Wed, 3 Oct 2018 12:51:25 -0700 Subject: [PATCH] Updated docs for 1.10.0 --- ..._1_1_heap_byte_buffer_factory-members.html | 1 + ..._builder_1_1_heap_byte_buffer_factory.html | 4 + flatbuffers_8h_source.html | 102 +++++++++--------- flatbuffers_guide_using_schema_compiler.html | 1 + functions.html | 3 + functions_func.html | 3 + group__flatbuffers__java__api.js | 3 +- ...ilder_1_1_byte_buffer_factory-members.html | 1 + ...uffer_builder_1_1_byte_buffer_factory.html | 38 +++++++ ..._buffer_builder_1_1_byte_buffer_factory.js | 3 +- navtreeindex1.js | 1 + search/all_f.js | 1 + search/functions_b.js | 1 + 13 files changed, 109 insertions(+), 53 deletions(-) diff --git a/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory-members.html b/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory-members.html index daedbfea..3f4c11a0 100644 --- a/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory-members.html +++ b/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory-members.html @@ -95,6 +95,7 @@ $(document).ready(function(){initNavTree('classcom_1_1google_1_1flatbuffers_1_1_ <p>This is the complete list of members for <a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html">com.google.flatbuffers.FlatBufferBuilder.HeapByteBufferFactory</a>, including all inherited members.</p> <table class="directory"> <tr class="even"><td class="entry"><a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html#aac26ff51a8162b37a072792ec9068644">newByteBuffer</a>(int capacity)</td><td class="entry"><a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html">com.google.flatbuffers.FlatBufferBuilder.HeapByteBufferFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> + <tr><td class="entry"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f">releaseByteBuffer</a>(ByteBuffer bb)</td><td class="entry"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html">com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> </table></div><!-- contents --> </div><!-- doc-content --> <!-- Google Analytics --> diff --git a/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html b/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html index 48cf5c72..fe2ad14e 100644 --- a/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html +++ b/classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html @@ -115,6 +115,10 @@ Public Member Functions</h2></td></tr> <tr class="memitem:aac26ff51a8162b37a072792ec9068644"><td class="memItemLeft" align="right" valign="top">ByteBuffer </td><td class="memItemRight" valign="bottom"><a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html#aac26ff51a8162b37a072792ec9068644">newByteBuffer</a> (int capacity)</td></tr> <tr class="memdesc:aac26ff51a8162b37a072792ec9068644"><td class="mdescLeft"> </td><td class="mdescRight">Create a <code>ByteBuffer</code> with a given capacity. <a href="#aac26ff51a8162b37a072792ec9068644">More...</a><br /></td></tr> <tr class="separator:aac26ff51a8162b37a072792ec9068644"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="inherit_header pub_methods_interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html">com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory</a></td></tr> +<tr class="memitem:a6cc2f5b5077273da8180b63a5db24b8f inherit pub_methods_interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory"><td class="memItemLeft" align="right" valign="top">default void </td><td class="memItemRight" valign="bottom"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f">releaseByteBuffer</a> (ByteBuffer bb)</td></tr> +<tr class="memdesc:a6cc2f5b5077273da8180b63a5db24b8f inherit pub_methods_interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory"><td class="mdescLeft"> </td><td class="mdescRight">Release a ByteBuffer. <a href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f">More...</a><br /></td></tr> +<tr class="separator:a6cc2f5b5077273da8180b63a5db24b8f inherit pub_methods_interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory"><td class="memSeparator" colspan="2"> </td></tr> </table> <h2 class="groupheader">Member Function Documentation</h2> <a id="aac26ff51a8162b37a072792ec9068644"></a> diff --git a/flatbuffers_8h_source.html b/flatbuffers_8h_source.html index e3fd7467..95a0497a 100644 --- a/flatbuffers_8h_source.html +++ b/flatbuffers_8h_source.html @@ -91,67 +91,67 @@ $(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> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Copyright 2014 Google Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * Licensed under the Apache License, Version 2.0 (the "License");</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <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> <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> <span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <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> <span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <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> <span class="comment"> * distributed under the License is distributed on an "AS IS" BASIS,</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <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> <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> <span class="comment"> * limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment"> */</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#ifndef FLATBUFFERS_H_</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#define FLATBUFFERS_H_</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include "flatbuffers/base.h"</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <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> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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>  uoffset_t o;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <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>  <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>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<void></a> Union()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<void></a>(o); }</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <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> };</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> EndianCheck() {</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordtype">int</span> endiantest = 1;</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="comment">// If this fails, see FLATBUFFERS_LITTLEENDIAN above.</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  FLATBUFFERS_ASSERT(*reinterpret_cast<char *>(&endiantest) ==</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  FLATBUFFERS_LITTLEENDIAN);</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  (void)endiantest;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> }</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> FLATBUFFERS_CONSTEXPR <span class="keywordtype">size_t</span> AlignOf() {</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor"> #ifdef _MSC_VER</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <span class="keywordflow">return</span> __alignof(T);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="preprocessor"> #ifndef alignof</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keywordflow">return</span> __alignof__(T);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keywordflow">return</span> <span class="keyword">alignof</span>(T);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> }</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <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> <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> <span class="comment">// perform the indirection and return a pointer.</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment">// The template specialization below does just that.</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment">// It is wrapped in a struct since function templates can't overload on the</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment">// return type like this.</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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>  <span class="keyword">typedef</span> T return_type;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="keyword">typedef</span> T mutable_return_type;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <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>  <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>  <span class="keywordflow">return</span> EndianScalar((reinterpret_cast<const T *>(p))[i]);</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  }</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> };</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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset</a><T>> {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <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>  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <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>  <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>  p += i * <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>return_type<span class="keyword">></span>(p + ReadScalar<uoffset_t>(p));</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  }</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> };</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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a><const T *> {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <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>  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <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>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>T *<span class="keyword">></span>(p + i * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  }</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> };</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> IT> <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>  <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>  <span class="keyword">typedef</span> IT value_type;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keyword">typedef</span> ptrdiff_t difference_type;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keyword">typedef</span> IT *pointer;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keyword">typedef</span> IT &reference;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <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>  : data_(data + <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a> * i) {}</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <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> &other) : data_(other.data_) {}</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other) {</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  data_ = other.data_;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  }</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator=(<a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &&other) {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  data_ = other.data_;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  }</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">return</span> data_ == other.data_;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  }</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> </div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordtype">bool</span> operator<(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">return</span> data_ < other.data_;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  }</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">return</span> data_ != other.data_;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  difference_type operator-(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">return</span> (data_ - other.data_) / <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  IT operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(data_, 0); }</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  IT operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(data_, 0); }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator++() {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <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>  <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>  data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  }</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> </div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator+(<span class="keyword">const</span> uoffset_t &offset)<span class="keyword"> const </span>{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <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<T>::element_stride</a>,</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  0);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator+=(<span class="keyword">const</span> uoffset_t &offset) {</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  data_ += offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  }</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator--() {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  }</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <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>  <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>  data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator-(<span class="keyword">const</span> uoffset_t &offset) {</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <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<T>::element_stride</a>,</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  0);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  }</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator-=(<span class="keyword">const</span> uoffset_t &offset) {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  data_ -= offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  }</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> </div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keyword">const</span> uint8_t *data_;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> };</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> </div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> <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> </div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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>  <span class="keyword">public</span>:</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator<T, typename IndirectHelper<T>::mutable_return_type</a>></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <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>  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator<T, typename IndirectHelper<T>::return_type</a>></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <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> </div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  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> </div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// Deprecated: use size(). Here for backwards compatibility.</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  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> </div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper<T>::return_type return_type;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper<T>::mutable_return_type mutable_return_type;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> </div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  return_type Get(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(Data(), i);</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  }</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  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> </div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <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>  <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>  <span class="comment">// type E.</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keyword">template</span><<span class="keyword">typename</span> E> E GetEnum(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>E<span class="keyword">></span>(Get(i));</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="comment">// If this a vector of unions, this does the cast for you. There's no check</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <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>  <span class="keyword">template</span><<span class="keyword">typename</span> U> <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>U *<span class="keyword">></span>(Get(i));</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> </div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="comment">// If this a vector of unions, this does the cast for you. There's no check</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <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>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">></span>(Get(i));</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  }</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">void</span> *<span class="keyword">></span>(Data() + o);</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> </div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  iterator begin() { <span class="keywordflow">return</span> iterator(Data(), 0); }</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  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> </div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  iterator end() { <span class="keywordflow">return</span> iterator(Data(), size()); }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  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> </div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <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>  <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>  <span class="keywordtype">void</span> Mutate(uoffset_t i, <span class="keyword">const</span> T &val) {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  WriteScalar(data() + i, val);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <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>  <span class="comment">// "val" 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>  <span class="comment">// e.g. reflection::AddFlatBuffer().</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <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>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  static_assert(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(uoffset_t), <span class="stringliteral">"Unrelated types"</span>);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  WriteScalar(data() + i,</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  static_cast<uoffset_t>(val - (Data() + i * <span class="keyword">sizeof</span>(uoffset_t))));</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <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>  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>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>mutable_return_type<span class="keyword">></span>(<a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(Data(), i));</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <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>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(&length_ + 1);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> </div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(&length_ + 1); }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <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>  <span class="keyword">const</span> T *data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>T *<span class="keyword">></span>(Data()); }</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  T *data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(Data()); }</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> </div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keyword">template</span><<span class="keyword">typename</span> K> return_type LookupByKey(K key)<span class="keyword"> const </span>{</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="keywordtype">void</span> *search_result = std::bsearch(</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  &key, Data(), size(), <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>, KeyCompare<K>);</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">if</span> (!search_result) {</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <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>  }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> </div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> uint8_t *element = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(search_result);</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> </div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(element, 0);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="comment">// This class is only used to access pre-existing data. Don't ever</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="comment">// try to construct these manually.</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>();</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> </div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  uoffset_t length_;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> </div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <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>  <span class="comment">// Private and unimplemented copy constructor.</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <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> &);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> </div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keyword">template</span><<span class="keyword">typename</span> K> <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>  <span class="keyword">const</span> K *key = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>K *<span class="keyword">></span>(ap);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keyword">const</span> uint8_t *data = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(bp);</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keyword">auto</span> table = <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(data, 0);</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <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>  <span class="comment">// result here.</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">return</span> -table->KeyCompareWithValue(*key);</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> };</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> </div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> <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> <span class="comment">// don'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> <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>  <span class="keyword">public</span>:</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  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> </div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(&length_ + 1);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  }</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(&length_ + 1); }</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> </div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <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> </div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  uoffset_t length_;</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span> </div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <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> &);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> };</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <span class="preprocessor">#ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a>> *VectorCast(<a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<U></a>> *ptr) {</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  static_assert(std::is_base_of<T, U>::value, <span class="stringliteral">"Unrelated types"</span>);</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a><span class="keyword">></span> *>(ptr);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span> }</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> </div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a>> *VectorCast(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<U></a>> *ptr) {</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  static_assert(std::is_base_of<T, U>::value, <span class="stringliteral">"Unrelated types"</span>);</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a><span class="keyword">></span> *>(ptr);</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> }</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> </div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <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> <span class="comment">// of whether it is null or not (the field is not set).</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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<T></a> *v) {</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">return</span> v ? v->Length() : 0;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> </div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_string.html"> 343</a></span> <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><char> {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <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<</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">></span>(Data()); }</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  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> </div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="preprocessor"> #ifdef FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  flatbuffers::string_view string_view()<span class="keyword"> const </span>{</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="keywordflow">return</span> flatbuffers::string_view(c_str(), Length());</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> <span class="preprocessor"> #endif // FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> </div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordtype">bool</span> operator<(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> &o)<span class="keyword"> const </span>{</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordflow">return</span> strcmp(c_str(), o.c_str()) < 0;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> };</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> <span class="comment">// Convenience function to get std::string from a String returning an empty</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> <span class="comment">// string on null pointer.</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> <span class="keyword">static</span> <span class="keyword">inline</span> std::string GetString(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> * str) {</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">return</span> str ? str->str() : <span class="stringliteral">""</span>;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> }</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> <span class="comment">// Convenience function to get char* from a String returning an empty string on</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> <span class="comment">// null pointer.</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * GetCstring(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> * str) {</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">return</span> str ? str->c_str() : <span class="stringliteral">""</span>;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> }</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> </div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> <span class="comment">// Allocator interface. This is flatbuffers-specific and meant only for</span></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> <span class="comment">// `vector_downward` usage.</span></div><div class="line"><a name="l00374"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_allocator.html"> 374</a></span> <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> {</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keyword">virtual</span> ~<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a>() {}</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="comment">// Allocate `size` bytes of memory.</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keyword">virtual</span> uint8_t *allocate(<span class="keywordtype">size_t</span> size) = 0;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> </div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="comment">// Deallocate `size` bytes of memory at `p` allocated by this allocator.</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <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="l00383"></a><span class="lineno"> 383</span> </div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="comment">// Reallocate `new_size` bytes of memory, replacing the old region of size</span></div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// `old_size` at `p`. In contrast to a normal realloc, this grows downwards,</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// and is intended specifcally for `vector_downward` use.</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="comment">// `in_use_back` and `in_use_front` indicate how much of `old_size` is</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="comment">// actually in use at each end, and needs to be copied.</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <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="l00390"></a><span class="lineno"> 390</span>  <span class="keywordtype">size_t</span> new_size, <span class="keywordtype">size_t</span> in_use_back,</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  FLATBUFFERS_ASSERT(new_size > old_size); <span class="comment">// vector_downward only grows</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  uint8_t *new_p = allocate(new_size);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  in_use_front);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  deallocate(old_p, old_size);</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordflow">return</span> new_p;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> </div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="comment">// Called by `reallocate_downward` to copy memory from `old_p` of `old_size`</span></div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="comment">// to `new_p` of `new_size`. Only memory of size `in_use_front` and</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <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="l00404"></a><span class="lineno"> 404</span>  <span class="comment">// allocation.</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <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="l00406"></a><span class="lineno"> 406</span>  uint8_t *new_p, <span class="keywordtype">size_t</span> new_size,</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keywordtype">size_t</span> in_use_back, <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back,</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  in_use_back);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  memcpy(new_p, old_p, in_use_front);</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span> };</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> </div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span> <span class="comment">// DefaultAllocator uses new/delete to allocate memory regions</span></div><div class="line"><a name="l00415"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_default_allocator.html"> 415</a></span> <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="l00416"></a><span class="lineno"> 416</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  uint8_t *allocate(<span class="keywordtype">size_t</span> size) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> uint8_t[size];</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  }</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keywordtype">void</span> deallocate(uint8_t *p, <span class="keywordtype">size_t</span>) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keyword">delete</span>[] p;</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  }</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> };</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> </div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span> <span class="comment">// These functions allow for a null allocator to mean use the default allocator,</span></div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span> <span class="comment">// as used by DetachedBuffer and vector_downward below.</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span> <span class="comment">// This is to avoid having a statically or dynamically allocated default</span></div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span> <span class="comment">// allocator, or having to move it between the classes that may own it.</span></div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> <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="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">return</span> allocator ? allocator->allocate(size)</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  : <a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a>().allocate(size);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span> }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> </div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span> <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="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">if</span> (allocator) allocator->deallocate(p, size);</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <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="l00438"></a><span class="lineno"> 438</span> }</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> </div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> <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="l00441"></a><span class="lineno"> 441</span>  <span class="keywordtype">size_t</span> old_size, <span class="keywordtype">size_t</span> new_size,</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordtype">size_t</span> in_use_back, <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">return</span> allocator</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  ? allocator->reallocate_downward(old_p, old_size, new_size,</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  in_use_back, in_use_front)</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  : <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="l00447"></a><span class="lineno"> 447</span>  in_use_back, in_use_front);</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span> }</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> </div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span> <span class="comment">// DetachedBuffer is a finished flatbuffer memory region, detached from its</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span> <span class="comment">// builder. The original memory region and allocator are also stored so that</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span> <span class="comment">// the DetachedBuffer can manage the memory lifetime.</span></div><div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_detached_buffer.html"> 453</a></span> <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> {</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>()</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  : allocator_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  own_allocator_(<span class="keyword">false</span>),</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  reserved_(0),</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  size_(0) {}</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> </div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <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="l00464"></a><span class="lineno"> 464</span>  <span class="keywordtype">size_t</span> reserved, uint8_t *cur, <span class="keywordtype">size_t</span> sz)</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  : allocator_(allocator),</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  own_allocator_(own_allocator),</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  buf_(buf),</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  reserved_(reserved),</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  cur_(cur),</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  size_(sz) {}</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> </div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &&other)</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  : allocator_(other.allocator_),</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  own_allocator_(other.own_allocator_),</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  buf_(other.buf_),</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  reserved_(other.reserved_),</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  cur_(other.cur_),</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  size_(other.size_) {</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  other.reset();</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  }</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> </div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &operator=(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &&other) {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  destroy();</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span> </div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  allocator_ = other.allocator_;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  own_allocator_ = other.own_allocator_;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  buf_ = other.buf_;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  reserved_ = other.reserved_;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  cur_ = other.cur_;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  size_ = other.size_;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span> </div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  other.reset();</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> </div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span> </div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  ~<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>() { destroy(); }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> </div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <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="l00500"></a><span class="lineno"> 500</span> </div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  uint8_t *data() { <span class="keywordflow">return</span> cur_; }</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size_; }</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> </div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span> <span class="preprocessor"> #if 0 // disabled for now due to the ordering of classes in this header</span></div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keyword">template</span> <<span class="keyword">class</span> T></div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordtype">bool</span> Verify()<span class="keyword"> const </span>{</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  Verifier verifier(data(), size());</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keywordflow">return</span> verifier.Verify<T>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  }</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span> </div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keyword">template</span> <<span class="keyword">class</span> T></div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keyword">const</span> T* GetRoot()<span class="keyword"> const </span>{</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(data());</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  }</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span> </div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keyword">template</span> <<span class="keyword">class</span> T></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  T* GetRoot() {</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(data());</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  }</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> </div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="comment">// These may change access mode, leave these at end of public section</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  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> &other))</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  FLATBUFFERS_DELETE_FUNC(</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &other))</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span> </div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  uint8_t *buf_;</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  uint8_t *cur_;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordtype">size_t</span> size_;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keyword">inline</span> <span class="keywordtype">void</span> destroy() {</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">if</span> (buf_) Deallocate(allocator_, buf_, reserved_);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordflow">if</span> (own_allocator_ && allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  reset();</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  }</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keyword">inline</span> <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  reserved_ = 0;</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  size_ = 0;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  }</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> };</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> </div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> <span class="comment">// This is a minimal replication of std::vector<uint8_t> functionality,</span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> <span class="comment">// except growing from higher to lower addresses. i.e push_back() inserts data</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> <span class="comment">// in the lowest address in the vector.</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="comment">// Since this vector leaves the lower part unused, we support a "scratch-pad"</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> <span class="comment">// that can be stored there for temporary data, to share the allocated space.</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> <span class="comment">// Essentially, this supports 2 std::vectors in a single buffer.</span></div><div class="line"><a name="l00560"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1vector__downward.html"> 560</a></span> <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> {</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <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="l00563"></a><span class="lineno"> 563</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator,</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordtype">bool</span> own_allocator,</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="keywordtype">size_t</span> buffer_minalign)</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  : allocator_(allocator),</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  own_allocator_(own_allocator),</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  initial_size_(initial_size),</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  buffer_minalign_(buffer_minalign),</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  reserved_(0),</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  scratch_(<span class="keyword">nullptr</span>) {}</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> </div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &&other)</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  : allocator_(other.allocator_),</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  own_allocator_(other.own_allocator_),</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  initial_size_(other.initial_size_),</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  buffer_minalign_(other.buffer_minalign_),</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  reserved_(other.reserved_),</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  buf_(other.buf_),</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  cur_(other.cur_),</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  scratch_(other.scratch_) {</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  other.allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  other.own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="comment">// No change in other.initial_size_</span></div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="comment">// No change in other.buffer_minalign_</span></div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  other.reserved_ = 0;</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  other.buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  other.cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  other.scratch_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  }</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span> </div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &operator=(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &&other) {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="comment">// Move construct a temporary and swap idiom</span></div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> temp(std::move(other));</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  swap(temp);</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  }</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> </div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  ~<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>() {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  clear_buffer();</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  clear_allocator();</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span> </div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  clear_buffer();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  clear();</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  }</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> </div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordtype">void</span> clear() {</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  cur_ = buf_ + reserved_;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  reserved_ = 0;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  }</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  clear_scratch();</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  }</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> </div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keywordtype">void</span> clear_scratch() {</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  scratch_ = buf_;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordtype">void</span> clear_allocator() {</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordflow">if</span> (own_allocator_ && allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> </div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  <span class="keywordtype">void</span> clear_buffer() {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordflow">if</span> (buf_) Deallocate(allocator_, buf_, reserved_);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  }</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span> </div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="comment">// Relinquish the pointer to the caller.</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  uint8_t *release_raw(<span class="keywordtype">size_t</span> &allocated_bytes, <span class="keywordtype">size_t</span> &offset) {</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keyword">auto</span> *buf = buf_;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  allocated_bytes = reserved_;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  offset = <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(cur_ - buf_);</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> </div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  clear_allocator();</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  clear();</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="keywordflow">return</span> buf;</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  }</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> </div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="comment">// Relinquish the pointer to the caller.</span></div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> release() {</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <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="l00651"></a><span class="lineno"> 651</span>  size());</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  clear();</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordflow">return</span> fb;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  }</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span> </div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordtype">size_t</span> ensure_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_);</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keywordflow">if</span> (len > static_cast<size_t>(cur_ - scratch_)) { reallocate(len); }</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="comment">// Beyond this, signed offsets may not have enough range:</span></div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="comment">// (FlatBuffers > 2GB not supported).</span></div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  FLATBUFFERS_ASSERT(size() < FLATBUFFERS_MAX_BUFFER_SIZE);</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordflow">return</span> len;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> </div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keyword">inline</span> uint8_t *make_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordtype">size_t</span> space = ensure_space(len);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  cur_ -= space;</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  }</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span> </div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="comment">// Returns nullptr if using the DefaultAllocator.</span></div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <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="l00676"></a><span class="lineno"> 676</span> </div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  uoffset_t size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(reserved_ - (cur_ - buf_));</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  }</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span> </div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  uoffset_t scratch_size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(scratch_ - buf_);</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  }</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordtype">size_t</span> capacity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> reserved_; }</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span> </div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  uint8_t *data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  FLATBUFFERS_ASSERT(cur_);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  }</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span> </div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  uint8_t *scratch_data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  FLATBUFFERS_ASSERT(buf_);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  <span class="keywordflow">return</span> buf_;</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  }</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span> </div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  uint8_t *scratch_end()<span class="keyword"> const </span>{</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  FLATBUFFERS_ASSERT(scratch_);</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordflow">return</span> scratch_;</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  }</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span> </div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  uint8_t *data_at(<span class="keywordtype">size_t</span> offset)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_ + reserved_ - offset; }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span> </div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordtype">void</span> push(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> num) {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  memcpy(make_space(num), bytes, num);</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span> </div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <span class="comment">// Specialized version of push() that avoids memcpy call for small data.</span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> push_small(<span class="keyword">const</span> T &little_endian_t) {</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  make_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  *<span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(cur_) = little_endian_t;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  }</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span> </div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> scratch_push_small(<span class="keyword">const</span> T &t) {</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  ensure_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  *<span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(scratch_) = t;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  scratch_ += <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  }</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span> </div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="comment">// fill() is most frequently called with small byte counts (<= 4),</span></div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="comment">// which is why we're using loops rather than calling memset.</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keywordtype">void</span> fill(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  make_space(zero_pad_bytes);</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < zero_pad_bytes; i++) cur_[i] = 0;</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  }</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span> </div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="comment">// Version for when we know the size is larger.</span></div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keywordtype">void</span> fill_big(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  memset(make_space(zero_pad_bytes), 0, zero_pad_bytes);</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  }</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span> </div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordtype">void</span> pop(<span class="keywordtype">size_t</span> bytes_to_remove) { cur_ += bytes_to_remove; }</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <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="l00734"></a><span class="lineno"> 734</span> </div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keywordtype">void</span> swap(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &other) {</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keyword">using</span> std::swap;</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  swap(allocator_, other.allocator_);</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  swap(own_allocator_, other.own_allocator_);</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  swap(initial_size_, other.initial_size_);</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  swap(buffer_minalign_, other.buffer_minalign_);</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  swap(reserved_, other.reserved_);</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  swap(buf_, other.buf_);</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  swap(cur_, other.cur_);</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  swap(scratch_, other.scratch_);</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  }</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span> </div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordtype">void</span> swap_allocator(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &other) {</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keyword">using</span> std::swap;</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  swap(allocator_, other.allocator_);</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  swap(own_allocator_, other.own_allocator_);</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  }</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span> </div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  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> &))</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &))</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span> </div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <span class="keywordtype">size_t</span> initial_size_;</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <span class="keywordtype">size_t</span> buffer_minalign_;</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  uint8_t *buf_;</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  uint8_t *cur_; <span class="comment">// Points at location between empty (below) and used (above).</span></div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  uint8_t *scratch_; <span class="comment">// Points to the end of the scratchpad in use.</span></div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span> </div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keywordtype">void</span> reallocate(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keyword">auto</span> old_reserved = reserved_;</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keyword">auto</span> old_size = size();</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="keyword">auto</span> old_scratch_size = scratch_size();</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  reserved_ += (std::max)(len,</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  old_reserved ? old_reserved / 2 : initial_size_);</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1);</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_,</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  old_size, old_scratch_size);</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  buf_ = Allocate(allocator_, reserved_);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  }</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  cur_ = buf_ + reserved_ - old_size;</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  scratch_ = buf_ + old_scratch_size;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  }</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span> };</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span> </div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span> <span class="comment">// Converts a Field ID to a virtual table offset.</span></div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span> <span class="keyword">inline</span> voffset_t FieldIndexToOffset(voffset_t field_id) {</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <span class="comment">// Should correspond to what EndTable() below builds up.</span></div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> fixed_fields = 2; <span class="comment">// Vtable size and Object Size.</span></div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>((field_id + fixed_fields) * <span class="keyword">sizeof</span>(voffset_t));</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span> }</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span> </div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span> <span class="keyword">const</span> T *data(<span class="keyword">const</span> std::vector<T, Alloc> &v) {</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="keywordflow">return</span> v.empty() ? nullptr : &v.front();</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span> }</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc> T *data(std::vector<T, Alloc> &v) {</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="keywordflow">return</span> v.empty() ? nullptr : &v.front();</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span> }</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span> <span class="comment"></span></div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span> <span class="comment">/// @endcond</span></div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span> <span class="comment">/// @addtogroup flatbuffers_cpp_api</span></div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span> <span class="comment">/// @{</span></div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span> <span class="comment">/// @class FlatBufferBuilder</span></div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span> <span class="comment">/// @brief Helper class to hold data needed in creation of a FlatBuffer.</span></div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> <span class="comment">/// To serialize data, you typically call one of the `Create*()` functions in</span></div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span> <span class="comment">/// the generated code, which in turn call a sequence of `StartTable`/</span></div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> <span class="comment">/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span> <span class="comment">/// `CreateVector` functions. Do this is depth-first order to build up a tree to</span></div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span> <span class="comment">/// the root. `Finish()` wraps up the buffer ready for transport.</span></div><div class="line"><a name="l00811"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html"> 811</a></span> <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="l00812"></a><span class="lineno"> 812</span>  <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span> <span class="comment"> /// @brief Default constructor for FlatBufferBuilder.</span></div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span> <span class="comment"> /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults</span></div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span> <span class="comment"> /// to `1024`.</span></div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span> <span class="comment"> /// @param[in] allocator An `Allocator` to use. If null will use</span></div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> <span class="comment"> /// `DefaultAllocator`.</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> <span class="comment"> /// @param[in] own_allocator Whether the builder/vector should own the</span></div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span> <span class="comment"> /// allocator. Defaults to / `false`.</span></div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> <span class="comment"> /// @param[in] buffer_minalign Force the buffer to be aligned to the given</span></div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span> <span class="comment"> /// minimum alignment upon reallocation. Only needed if you intend to store</span></div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span> <span class="comment"> /// types with custom alignment AND you wish to read the buffer in-place</span></div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span> <span class="comment"> /// directly after creation.</span></div><div class="line"><a name="l00824"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c"> 824</a></span> <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="l00825"></a><span class="lineno"> 825</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator = <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="keywordtype">bool</span> own_allocator = <span class="keyword">false</span>,</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <span class="keywordtype">size_t</span> buffer_minalign =</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  AlignOf<largest_scalar_t>())</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  : buf_(initial_size, allocator, own_allocator, buffer_minalign),</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  num_field_loc(0),</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  max_voffset_(0),</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  nested(false),</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  finished(false),</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  minalign_(1),</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  force_defaults_(false),</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  dedup_vtables_(true),</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  string_pool(nullptr) {</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  EndianCheck();</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  }</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span> <span class="comment"></span></div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span> <span class="comment"> /// @brief Move constructor for FlatBufferBuilder.</span></div><div class="line"><a name="l00842"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a86e1a348b7474fd5d239016ae97afc56"> 842</a></span> <span class="comment"></span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a86e1a348b7474fd5d239016ae97afc56">FlatBufferBuilder</a>(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &&other)</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  : buf_(1024, nullptr, false, AlignOf<largest_scalar_t>()),</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  num_field_loc(0),</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  max_voffset_(0),</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  nested(false),</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  finished(false),</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  minalign_(1),</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  force_defaults_(false),</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  dedup_vtables_(true),</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  string_pool(nullptr) {</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  EndianCheck();</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="comment">// Default construct and swap idiom.</span></div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="comment">// Lack of delegating constructors in vs2010 makes it more verbose than needed.</span></div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  Swap(other);</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  }</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span> <span class="comment"></span></div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span> <span class="comment"> /// @brief Move assignment operator for FlatBufferBuilder.</span></div><div class="line"><a name="l00859"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae65f0619ecb7715ffdae399ebfc56e38"> 859</a></span> <span class="comment"></span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ae65f0619ecb7715ffdae399ebfc56e38">operator=</a>(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &&other) {</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="comment">// Move construct a temporary and swap idiom</span></div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> temp(std::move(other));</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  Swap(temp);</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  }</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span> </div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordtype">void</span> Swap(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &other) {</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keyword">using</span> std::swap;</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  buf_.swap(other.buf_);</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  swap(num_field_loc, other.num_field_loc);</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  swap(max_voffset_, other.max_voffset_);</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  swap(nested, other.nested);</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  swap(finished, other.finished);</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  swap(minalign_, other.minalign_);</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  swap(force_defaults_, other.force_defaults_);</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  swap(dedup_vtables_, other.dedup_vtables_);</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  swap(string_pool, other.string_pool);</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  }</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span> </div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  ~<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>() {</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="keywordflow">if</span> (string_pool) <span class="keyword">delete</span> string_pool;</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  }</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span> </div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="keywordtype">void</span> Reset() {</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  Clear(); <span class="comment">// clear builder state</span></div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  buf_.reset(); <span class="comment">// deallocate buffer</span></div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  }</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span> <span class="comment"></span></div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span> <span class="comment"> /// @brief Reset all the state in this FlatBufferBuilder so it can be reused</span></div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span> <span class="comment"> /// to construct another buffer.</span></div><div class="line"><a name="l00890"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412"> 890</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">Clear</a>() {</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  ClearOffsets();</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  buf_.clear();</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  nested = <span class="keyword">false</span>;</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  finished = <span class="keyword">false</span>;</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  minalign_ = 1;</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  <span class="keywordflow">if</span> (string_pool) string_pool->clear();</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  }</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span> <span class="comment"></span></div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span> <span class="comment"> /// @brief The current size of the serialized buffer, counting from the end.</span></div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span> <span class="comment"> /// @return Returns an `uoffset_t` with the current size of the buffer.</span></div><div class="line"><a name="l00901"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f"> 901</a></span> <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="l00902"></a><span class="lineno"> 902</span> <span class="comment"></span></div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span> <span class="comment"> /// @brief Get the serialized buffer (after you call `Finish()`).</span></div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> <span class="comment"> /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the</span></div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span> <span class="comment"> /// buffer.</span></div><div class="line"><a name="l00906"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83"> 906</a></span> <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="l00907"></a><span class="lineno"> 907</span>  Finished();</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordflow">return</span> buf_.data();</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  }</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> <span class="comment"></span></div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span> <span class="comment"> /// @brief Get a pointer to an unfinished buffer.</span></div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span> <span class="comment"> /// @return Returns a `uint8_t` pointer to the unfinished buffer.</span></div><div class="line"><a name="l00913"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41"> 913</a></span> <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="l00914"></a><span class="lineno"> 914</span> <span class="comment"></span></div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span> <span class="comment"> /// @brief Get the released pointer to the serialized buffer.</span></div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> <span class="comment"> /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards!</span></div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span> <span class="comment"> /// @return A `FlatBuffer` that owns the buffer and its allocator and</span></div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span> <span class="comment"> /// behaves similar to a `unique_ptr` with a deleter.</span></div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span> <span class="comment"> /// Deprecated: use Release() instead</span></div><div class="line"><a name="l00920"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8"> 920</a></span> <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="l00921"></a><span class="lineno"> 921</span>  Finished();</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  }</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span> <span class="comment"></span></div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span> <span class="comment"> /// @brief Get the released DetachedBuffer.</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span> <span class="comment"> /// @return A `DetachedBuffer` that owns the buffer and its allocator.</span></div><div class="line"><a name="l00927"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45"> 927</a></span> <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="l00928"></a><span class="lineno"> 928</span>  Finished();</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  }</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span> <span class="comment"></span></div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span> <span class="comment"> /// @brief Get the released pointer to the serialized buffer.</span></div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span> <span class="comment"> /// @param The size of the memory block containing </span></div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span> <span class="comment"> /// the serialized `FlatBuffer`.</span></div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span> <span class="comment"> /// @param The offset from the released pointer where the finished </span></div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span> <span class="comment"> /// `FlatBuffer` starts.</span></div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span> <span class="comment"> /// @return A raw pointer to the start of the memory block containing </span></div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span> <span class="comment"> /// the serialized `FlatBuffer`. </span></div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span> <span class="comment"> /// @remark If the allocator is owned, it gets deleted during this call.</span></div><div class="line"><a name="l00940"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416"> 940</a></span> <span class="comment"></span> uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416">ReleaseRaw</a>(<span class="keywordtype">size_t</span> &size, <span class="keywordtype">size_t</span> &offset) {</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  Finished();</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <span class="keywordflow">return</span> buf_.release_raw(size, offset);</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  }</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span> <span class="comment"></span></div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span> <span class="comment"> /// @brief get the minimum alignment this buffer needs to be accessed</span></div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span> <span class="comment"> /// properly. This is only known once all elements have been written (after</span></div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span> <span class="comment"> /// you call Finish()). You can use this information if you need to embed</span></div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span> <span class="comment"> /// a FlatBuffer in some other buffer, such that you can later read it</span></div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span> <span class="comment"> /// without first having to copy it into its own buffer.</span></div><div class="line"><a name="l00950"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b"> 950</a></span> <span class="comment"></span> <span class="keywordtype">size_t</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">GetBufferMinAlignment</a>() {</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  Finished();</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="keywordflow">return</span> minalign_;</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  }</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span> <span class="comment"></span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span> <span class="comment"></span> <span class="keywordtype">void</span> Finished()<span class="keyword"> const </span>{</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="comment">// If you get this assert, you're attempting to get access a buffer</span></div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  <span class="comment">// which hasn't been finished yet. Be sure to call</span></div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="comment">// FlatBufferBuilder::Finish with your root table.</span></div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  <span class="comment">// If you really need to access an unfinished buffer, call</span></div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="comment">// GetCurrentBufferPointer instead.</span></div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  FLATBUFFERS_ASSERT(finished);</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  }<span class="comment"></span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span> <span class="comment"> /// @brief In order to save space, fields that are set to their default value</span></div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span> <span class="comment"> /// don't get serialized into the buffer.</span></div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span> <span class="comment"> /// @param[in] bool fd When set to `true`, always serializes default values that are set.</span></div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span> <span class="comment"> /// Optional fields which are not set explicitly, will still not be serialized.</span></div><div class="line"><a name="l00970"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a"> 970</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">ForceDefaults</a>(<span class="keywordtype">bool</span> fd) { force_defaults_ = fd; }</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span> <span class="comment"></span></div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="comment"> /// @brief By default vtables are deduped in order to save space.</span></div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span> <span class="comment"> /// @param[in] bool dedup When set to `true`, dedup vtables.</span></div><div class="line"><a name="l00974"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961"> 974</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">DedupVtables</a>(<span class="keywordtype">bool</span> dedup) { dedup_vtables_ = dedup; }</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="comment"></span></div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span> <span class="comment"></span> <span class="keywordtype">void</span> Pad(<span class="keywordtype">size_t</span> num_bytes) { buf_.fill(num_bytes); }</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span> </div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordtype">void</span> TrackMinAlign(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  <span class="keywordflow">if</span> (elem_size > minalign_) minalign_ = elem_size;</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  }</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span> </div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  <span class="keywordtype">void</span> Align(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  TrackMinAlign(elem_size);</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  buf_.fill(PaddingBytes(buf_.size(), elem_size));</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  }</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span> </div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="keywordtype">void</span> PushFlatBuffer(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> size) {</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  PushBytes(bytes, size);</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  finished = <span class="keyword">true</span>;</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  }</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span> </div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <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="l00994"></a><span class="lineno"> 994</span> </div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  <span class="keywordtype">void</span> PopBytes(<span class="keywordtype">size_t</span> amount) { buf_.pop(amount); }</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span> </div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AssertScalarT() {</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  <span class="comment">// The code assumes power of 2 sizes and endian-swap-ability.</span></div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  static_assert(flatbuffers::is_scalar<T>::value, <span class="stringliteral">"T must be a scalar type"</span>);</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  }</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> </div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <span class="comment">// Write a single aligned scalar to the buffer</span></div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(T element) {</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  AssertScalarT<T>();</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  T litle_endian_element = EndianScalar(element);</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  Align(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  buf_.push_small(litle_endian_element);</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  }</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span> </div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> off) {</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="comment">// Special case for offsets: see ReferTo below.</span></div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  <span class="keywordflow">return</span> PushElement(ReferTo(off.o));</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> </div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="comment">// When writing fields, we track where they are, so we can create correct</span></div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="comment">// vtables later.</span></div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <span class="keywordtype">void</span> TrackField(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <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="l01020"></a><span class="lineno"> 1020</span>  buf_.scratch_push_small(fl);</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  num_field_loc++;</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  max_voffset_ = (std::max)(max_voffset_, field);</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  }</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span> </div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <span class="comment">// Like PushElement, but additionally tracks the field this represents.</span></div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddElement(voffset_t field, T e, T def) {</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  <span class="comment">// We don't serialize values equal to the default.</span></div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  <span class="keywordflow">if</span> (e == def && !force_defaults_) <span class="keywordflow">return</span>;</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  <span class="keyword">auto</span> off = PushElement(e);</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  TrackField(field, off);</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  }</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span> </div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddOffset(voffset_t field, <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> off) {</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  <span class="keywordflow">if</span> (off.IsNull()) <span class="keywordflow">return</span>; <span class="comment">// Don't store.</span></div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  AddElement(field, ReferTo(off.o), static_cast<uoffset_t>(0));</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  }</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> </div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddStruct(voffset_t field, <span class="keyword">const</span> T *structptr) {</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  <span class="keywordflow">if</span> (!structptr) <span class="keywordflow">return</span>; <span class="comment">// Default, don't store.</span></div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  Align(AlignOf<T>());</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  buf_.push_small(*structptr);</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  TrackField(field, GetSize());</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  }</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> </div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordtype">void</span> AddStructOffset(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  TrackField(field, off);</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  }</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> </div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="comment">// Offsets initially are relative to the end of the buffer (downwards).</span></div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">// This function converts them to be relative to the current location</span></div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="comment">// in the buffer (when stored here), pointing upwards.</span></div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  uoffset_t ReferTo(uoffset_t off) {</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <span class="comment">// Align to ensure GetSize() below is correct.</span></div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  Align(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="comment">// Offset must refer to something already in buffer.</span></div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  FLATBUFFERS_ASSERT(off && off <= GetSize());</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  <span class="keywordflow">return</span> GetSize() - off + <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  }</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span> </div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  <span class="keywordtype">void</span> NotNested() {</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="comment">// If you hit this, you're trying to construct a Table/Vector/String</span></div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  <span class="comment">// during the construction of its parent table (between the MyTableBuilder</span></div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <span class="comment">// and table.Finish().</span></div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <span class="comment">// Move the creation of these sub-objects to above the MyTableBuilder to</span></div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="comment">// not get this assert.</span></div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  <span class="comment">// Ignoring this assert may appear to work in simple cases, but the reason</span></div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  <span class="comment">// it is here is that storing objects in-line may cause vtable offsets</span></div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  <span class="comment">// to not fit anymore. It also leads to vtable duplication.</span></div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  FLATBUFFERS_ASSERT(!nested);</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  <span class="comment">// If you hit this, fields were added outside the scope of a table.</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  FLATBUFFERS_ASSERT(!num_field_loc);</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  }</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> </div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <span class="comment">// From generated code (or from the parser), we call StartTable/EndTable</span></div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  <span class="comment">// with a sequence of AddElement calls in between.</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  uoffset_t StartTable() {</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  NotNested();</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  nested = <span class="keyword">true</span>;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  }</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span> </div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  <span class="comment">// This finishes one serialized object by generating the vtable if it's a</span></div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  <span class="comment">// table, comparing it against existing vtables, and writing the</span></div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  <span class="comment">// resulting vtable offset.</span></div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  uoffset_t EndTable(uoffset_t start) {</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  <span class="comment">// If you get this assert, a corresponding StartTable wasn't called.</span></div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  FLATBUFFERS_ASSERT(nested);</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  <span class="comment">// Write the vtable offset, which is the start of any Table.</span></div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <span class="comment">// We fill it's value later.</span></div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  <span class="keyword">auto</span> vtableoffsetloc = PushElement<soffset_t>(0);</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  <span class="comment">// Write a vtable, which consists entirely of voffset_t elements.</span></div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <span class="comment">// It starts with the number of offsets, followed by a type id, followed</span></div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  <span class="comment">// by the offsets themselves. In reverse:</span></div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  <span class="comment">// Include space for the last offset and ensure empty tables have a</span></div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  <span class="comment">// minimum size.</span></div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  max_voffset_ =</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  (std::max)(static_cast<voffset_t>(max_voffset_ + <span class="keyword">sizeof</span>(voffset_t)),</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  FieldIndexToOffset(0));</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  buf_.fill_big(max_voffset_);</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="keyword">auto</span> table_object_size = vtableoffsetloc - start;</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="comment">// Vtable use 16bit offsets.</span></div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  FLATBUFFERS_ASSERT(table_object_size < 0x10000);</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  WriteScalar<voffset_t>(buf_.data() + <span class="keyword">sizeof</span>(voffset_t),</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  static_cast<voffset_t>(table_object_size));</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  WriteScalar<voffset_t>(buf_.data(), max_voffset_);</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="comment">// Write the offsets into the table</span></div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <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="l01108"></a><span class="lineno"> 1108</span>  it < 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="l01109"></a><span class="lineno"> 1109</span>  <span class="keyword">auto</span> field_location = <span class="keyword">reinterpret_cast<</span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> *<span class="keyword">></span>(it);</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="keyword">auto</span> pos = <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>(vtableoffsetloc - field_location->off);</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="comment">// If this asserts, it means you've set a field twice.</span></div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  FLATBUFFERS_ASSERT(</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  !ReadScalar<voffset_t>(buf_.data() + field_location->id));</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  WriteScalar<voffset_t>(buf_.data() + field_location->id, pos);</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  }</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  ClearOffsets();</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  <span class="keyword">auto</span> vt1 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data());</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <span class="keyword">auto</span> vt1_size = ReadScalar<voffset_t>(vt1);</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  <span class="keyword">auto</span> vt_use = GetSize();</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  <span class="comment">// See if we already have generated a vtable with this exact same</span></div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  <span class="comment">// layout before. If so, make it point to the old one, remove this one.</span></div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  <span class="keywordflow">if</span> (dedup_vtables_) {</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = buf_.scratch_data(); it < buf_.scratch_end();</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  it += <span class="keyword">sizeof</span>(uoffset_t)) {</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <span class="keyword">auto</span> vt_offset_ptr = <span class="keyword">reinterpret_cast<</span>uoffset_t *<span class="keyword">></span>(it);</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="keyword">auto</span> vt2 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data_at(*vt_offset_ptr));</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  <span class="keyword">auto</span> vt2_size = *vt2;</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  <span class="keywordflow">if</span> (vt1_size != vt2_size || memcmp(vt2, vt1, vt1_size)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  vt_use = *vt_offset_ptr;</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  buf_.pop(GetSize() - vtableoffsetloc);</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  }</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  }</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  <span class="comment">// If this is a new vtable, remember it.</span></div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  <span class="keywordflow">if</span> (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); }</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  <span class="comment">// Fill the vtable offset we created above.</span></div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  <span class="comment">// The offset points from the beginning of the object to where the</span></div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <span class="comment">// vtable is stored.</span></div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="comment">// Offsets default direction is downward in memory for future format</span></div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  <span class="comment">// flexibility (storing all vtables at the start of the file).</span></div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  WriteScalar(buf_.data_at(vtableoffsetloc),</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <span class="keyword">static_cast<</span>soffset_t<span class="keyword">></span>(vt_use) -</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  static_cast<soffset_t>(vtableoffsetloc));</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> </div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  nested = <span class="keyword">false</span>;</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="keywordflow">return</span> vtableoffsetloc;</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  }</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  <span class="comment">// DEPRECATED: call the version above instead.</span></div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  uoffset_t EndTable(uoffset_t start, voffset_t <span class="comment">/*numfields*/</span>) {</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  <span class="keywordflow">return</span> EndTable(start);</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  }</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> </div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="comment">// This checks a required field has been set in a given table that has</span></div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <span class="comment">// just been constructed.</span></div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> Required(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> table, voffset_t field);</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> </div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  uoffset_t StartStruct(<span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  Align(alignment);</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  }</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span> </div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  uoffset_t EndStruct() { <span class="keywordflow">return</span> GetSize(); }</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span> </div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  <span class="keywordtype">void</span> ClearOffsets() {</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  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="l01167"></a><span class="lineno"> 1167</span>  num_field_loc = 0;</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  max_voffset_ = 0;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  }</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span> </div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  <span class="comment">// Aligns such that when "len" bytes are written, an object can be written</span></div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <span class="comment">// after it with "alignment" without padding.</span></div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  TrackMinAlign(alignment);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  buf_.fill(PaddingBytes(GetSize() + len, alignment));</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  }</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  AssertScalarT<T>();</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  PreAlign(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  }<span class="comment"></span></div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01187"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe"> 1187</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01188"></a><span class="lineno"> 1188</span>  NotNested();</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  PreAlign<uoffset_t>(len + 1); <span class="comment">// Always 0-terminated.</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  buf_.fill(1);</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  PushBytes(reinterpret_cast<const uint8_t *>(str), len);</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  PushElement(static_cast<uoffset_t>(len));</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a>(GetSize());</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  }</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> <span class="comment"></span></div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> <span class="comment"> /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01199"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5"> 1199</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01200"></a><span class="lineno"> 1200</span>  <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  }</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> <span class="comment"></span></div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> <span class="comment"> /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span> <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="l01205"></a><span class="lineno"> 1205</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01206"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154"> 1206</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01207"></a><span class="lineno"> 1207</span>  <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  }</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> <span class="comment"></span></div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01213"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f"> 1213</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a>(<span class="keyword">const</span> std::string &str) {</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  }</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span> </div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span> <span class="preprocessor"> #ifdef FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> <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="l01221"></a><span class="lineno"> 1221</span> <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="l01222"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6"> 1222</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01223"></a><span class="lineno"> 1223</span>  <span class="keywordflow">return</span> CreateString(str.data(), str.size());</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  }</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span> <span class="preprocessor"> #endif // FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span> <span class="comment"></span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01231"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506"> 1231</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01232"></a><span class="lineno"> 1232</span>  <span class="keywordflow">return</span> str ? CreateString(str->c_str(), str->Length()) : 0;</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  }</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span> <span class="comment"></span></div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span> <span class="comment"> /// @param[in] str A const reference to a std::string like type with support</span></div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span> <span class="comment"> /// of T::c_str() and T::length() to store in the buffer.</span></div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01239"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685"> 1239</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685">CreateString</a>(<span class="keyword">const</span> T &str) {</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  }</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> <span class="comment"></span></div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01249"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1"> 1249</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01250"></a><span class="lineno"> 1250</span>  <span class="keywordflow">if</span> (!string_pool)</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  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="l01252"></a><span class="lineno"> 1252</span>  <span class="keyword">auto</span> size_before_string = buf_.size();</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  <span class="comment">// Must first serialize the string, since the set is all offsets into</span></div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <span class="comment">// buffer.</span></div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <span class="keyword">auto</span> off = CreateString(str, len);</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keyword">auto</span> it = string_pool->find(off);</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="comment">// If it exists we reuse existing serialized data!</span></div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordflow">if</span> (it != string_pool->end()) {</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  <span class="comment">// We can remove the string we serialized.</span></div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  buf_.pop(buf_.size() - size_before_string);</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  <span class="keywordflow">return</span> *it;</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  }</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  <span class="comment">// Record this string for future use.</span></div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  string_pool->insert(off);</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <span class="keywordflow">return</span> off;</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  }</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> <span class="comment"></span></div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span> <span class="comment"> /// @brief Store a string in the buffer, which null-terminated.</span></div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01273"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7"> 1273</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01274"></a><span class="lineno"> 1274</span>  <span class="keywordflow">return</span> CreateSharedString(str, strlen(str));</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  }</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span> <span class="comment"></span></div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01282"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9"> 1282</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">CreateSharedString</a>(<span class="keyword">const</span> std::string &str) {</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  <span class="keywordflow">return</span> CreateSharedString(str.c_str(), str.length());</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  }</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> <span class="comment"></span></div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01291"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3"> 1291</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01292"></a><span class="lineno"> 1292</span>  <span class="keywordflow">return</span> CreateSharedString(str->c_str(), str->Length());</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  }</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span> <span class="comment"></span></div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span> <span class="comment"></span> uoffset_t EndVector(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  FLATBUFFERS_ASSERT(nested); <span class="comment">// Hit if no corresponding StartVector.</span></div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  nested = <span class="keyword">false</span>;</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  <span class="keywordflow">return</span> PushElement(static_cast<uoffset_t>(len));</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  }</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span> </div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="keywordtype">void</span> StartVector(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize) {</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  NotNested();</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  nested = <span class="keyword">true</span>;</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  PreAlign<uoffset_t>(len * elemsize);</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  PreAlign(len * elemsize, elemsize); <span class="comment">// Just in case elemsize > uoffset_t.</span></div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  }</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  <span class="comment">// Call this right before StartVector/CreateVector if you want to force the</span></div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="comment">// alignment to be something different than what the element size would</span></div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="comment">// normally dictate.</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <span class="comment">// This is useful when storing a nested_flatbuffer in a vector of bytes,</span></div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <span class="comment">// or when storing SIMD floats, etc.</span></div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  <span class="keywordtype">void</span> ForceVectorAlignment(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize, <span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  PreAlign(len * elemsize, alignment);</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  }</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> </div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  <span class="comment">// Similar to ForceVectorAlignment but for String fields.</span></div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  <span class="keywordtype">void</span> ForceStringAlignment(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  PreAlign((len + 1) * <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), alignment);</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  }</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span> <span class="comment"></span></div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span> <span class="comment"> /// @brief Serialize an array into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span> <span class="comment"> /// @tparam T The data type of the array elements.</span></div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01332"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3"> 1332</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01333"></a><span class="lineno"> 1333</span>  <span class="comment">// If this assert hits, you're specifying a template argument that is</span></div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="comment">// causing the wrong overload to be selected, remove it.</span></div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  AssertScalarT<T>();</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  StartVector(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span> <span class="preprocessor"> #if FLATBUFFERS_LITTLEENDIAN</span></div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), len * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(T) == 1) {</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), len);</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i > 0; ) {</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  PushElement(v[--i]);</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  }</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  }</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>>(EndVector(len));</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  }</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> </div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>> CreateVector(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  StartVector(len, <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a>));</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i > 0;) { PushElement(v[--i]); }</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>>(EndVector(len));</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  }</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> <span class="comment"></span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> <span class="comment"> /// @brief Serialize a `std::vector` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span> <span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> <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> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01366"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207"> 1366</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(<span class="keyword">const</span> std::vector<T> &v) {</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="keywordflow">return</span> CreateVector(data(v), v.size());</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  }</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span> </div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <span class="comment">// vector<bool> may be implemented using a bit-set, so we can't access it as</span></div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <span class="comment">// an array. Instead, read elements manually.</span></div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <span class="comment">// Background: https://isocpp.org/blog/2012/11/on-vectorbool</span></div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<uint8_t></a>> CreateVector(<span class="keyword">const</span> std::vector<bool> &v) {</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  StartVector(v.size(), <span class="keyword">sizeof</span>(uint8_t));</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = v.size(); i > 0;) {</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  PushElement(static_cast<uint8_t>(v[--i]));</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  }</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<uint8_t></a>>(EndVector(v.size()));</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  }</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span> </div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span> <span class="comment"> /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span> <span class="comment"></span><span class="comment"> /// This is a convenience function that takes care of iteration for you.</span></div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span> <span class="comment"></span><span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> <span class="comment"></span><span class="comment"> /// @param f A function that takes the current iteration 0..vector_size-1 and</span></div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> <span class="comment"></span><span class="comment"> /// returns any type that you can construct a FlatBuffers vector out of.</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> <span class="comment"></span><span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span> <span class="comment"></span><span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01390"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b"> 1390</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01391"></a><span class="lineno"> 1391</span>  <span class="keyword">const</span> std::function<T (<span class="keywordtype">size_t</span> i)> &f) {</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  std::vector<T> elems(vector_size);</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) elems[i] = f(i);</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  }</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span> <span class="comment"></span></div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> <span class="comment"> /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span> <span class="comment"> /// This is a convenience function that takes care of iteration for you.</span></div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span> <span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> <span class="comment"> /// @param f A function that takes the current iteration 0..vector_size-1,</span></div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span> <span class="comment"> /// and the state parameter returning any type that you can construct a</span></div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> <span class="comment"> /// FlatBuffers vector out of.</span></div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span> <span class="comment"> /// @param state State passed to f.</span></div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S></div><div class="line"><a name="l01409"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a"> 1409</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01410"></a><span class="lineno"> 1410</span>  std::vector<T> elems(vector_size);</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) elems[i] = f(i, state);</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  }</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> <span class="comment"></span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span> <span class="comment"> /// @brief Serialize a `std::vector<std::string>` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> <span class="comment"> /// This is a convenience function for a common case.</span></div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01421"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6"> 1421</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<String></a>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  <span class="keyword">const</span> std::vector<std::string> &v) {</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  std::vector<Offset<String>> offsets(v.size());</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < v.size(); i++) offsets[i] = CreateString(v[i]);</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  <span class="keywordflow">return</span> CreateVector(offsets);</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  }</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span> <span class="comment"></span></div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01436"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7"> 1436</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01437"></a><span class="lineno"> 1437</span>  StartVector(len * <span class="keyword">sizeof</span>(T) / AlignOf<T>(), AlignOf<T>());</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), <span class="keyword">sizeof</span>(T) * len);</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>>(EndVector(len));</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  }</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span> <span class="comment"></span></div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span> <span class="comment"> /// @brief Serialize an array of native structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span> <span class="comment"> /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> <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="l01446"></a><span class="lineno"> 1446</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01451"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53"> 1451</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01452"></a><span class="lineno"> 1452</span>  <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  std::vector<T> vv(len);</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  std::transform(v, v + len, vv.begin(), *(Pack_t)&Pack);</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  <span class="keywordflow">return</span> CreateVectorOfStructs<T>(vv.data(), vv.size());</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  }</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span> </div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span> <span class="comment"></span><span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span> <span class="comment"></span><span class="comment"> /// @param[in] f A function that takes the current iteration 0..vector_size-1</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span> <span class="comment"></span><span class="comment"> /// and a pointer to the struct that must be filled.</span></div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> <span class="comment"></span><span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> <span class="comment"></span><span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span> <span class="comment"></span><span class="comment"> /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span> <span class="comment"></span><span class="comment"> /// accessors.</span></div><div class="line"><a name="l01470"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72"> 1470</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keywordtype">size_t</span> vector_size, <span class="keyword">const</span> std::function<<span class="keywordtype">void</span>(<span class="keywordtype">size_t</span> i, T *)> &filler) {</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  T* structs = StartVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) {</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  filler(i, structs);</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  structs++;</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  }</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="keywordflow">return</span> EndVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  }</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span> <span class="comment"></span></div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</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="l01485"></a><span class="lineno"> 1485</span> <span class="comment"> /// a pointer to the struct that must be filled and the state argument.</span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span> <span class="comment"> /// @param[in] state Arbitrary state to pass to f.</span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span> <span class="comment"> /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span> <span class="comment"> /// accessors.</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S></div><div class="line"><a name="l01492"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5"> 1492</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01493"></a><span class="lineno"> 1493</span>  S *state) {</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  T *structs = StartVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) {</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  f(i, structs, state);</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  structs++;</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  }</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="keywordflow">return</span> EndVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  }</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span> <span class="comment"></span></div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span> <span class="comment"> /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc></div><div class="line"><a name="l01509"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42"> 1509</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  <span class="keyword">const</span> std::vector<T, Alloc> &v) {</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keywordflow">return</span> CreateVectorOfStructs(data(v), v.size());</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  }</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span> <span class="comment"></span></div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span> <span class="comment"> /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> <span class="comment"> /// `vector`.</span></div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> <span class="comment"> /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01523"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95"> 1523</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">CreateVectorOfNativeStructs</a>(</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <span class="keyword">const</span> std::vector<S> &v) {</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  <span class="keywordflow">return</span> CreateVectorOfNativeStructs<T, S>(data(v), v.size());</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  }</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span> <span class="comment"></span></div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>StructKeyComparator {</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> T &a, <span class="keyword">const</span> T &b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  <span class="keywordflow">return</span> a.KeyCompareLessThan(&b);</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>  }</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> </div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>  StructKeyComparator &operator=(<span class="keyword">const</span> StructKeyComparator &);</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  };<span class="comment"></span></div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span> <span class="comment"> /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`</span></div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> <span class="comment"> /// in sorted order.</span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01547"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15"> 1547</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">CreateVectorOfSortedStructs</a>(std::vector<T> *v) {</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keywordflow">return</span> CreateVectorOfSortedStructs(data(*v), v->size());</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  }</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> <span class="comment"></span></div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span> <span class="comment"> /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span> <span class="comment"> /// `vector` in sorted order.</span></div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span> <span class="comment"> /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01560"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54"> 1560</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">CreateVectorOfSortedNativeStructs</a>(</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  std::vector<S> *v) {</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  <span class="keywordflow">return</span> CreateVectorOfSortedNativeStructs<T, S>(data(*v), v->size());</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  }</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span> <span class="comment"></span></div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted</span></div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span> <span class="comment"> /// order.</span></div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01574"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf"> 1574</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01575"></a><span class="lineno"> 1575</span>  std::sort(v, v + len, StructKeyComparator<T>());</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  <span class="keywordflow">return</span> CreateVectorOfStructs(v, len);</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  }</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span> <span class="comment"></span></div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span> <span class="comment"> /// @brief Serialize an array of native structs into a FlatBuffer `vector` in</span></div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span> <span class="comment"> /// sorted order.</span></div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span> <span class="comment"> /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span> <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="l01584"></a><span class="lineno"> 1584</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01589"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf"> 1589</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">CreateVectorOfSortedNativeStructs</a>(S *v,</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  std::vector<T> vv(len);</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  std::transform(v, v + len, vv.begin(), *(Pack_t)&Pack);</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  <span class="keywordflow">return</span> CreateVectorOfSortedStructs<T>(vv, len);</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  }</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span> <span class="comment"></span></div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>TableKeyComparator {</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  TableKeyComparator(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &buf) : buf_(buf) {}</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> &a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> &b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  <span class="keyword">auto</span> table_a = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(a.o));</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  <span class="keyword">auto</span> table_b = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(b.o));</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <span class="keywordflow">return</span> table_a->KeyCompareLessThan(table_b);</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  }</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &buf_;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span> </div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  TableKeyComparator &operator=(<span class="keyword">const</span> TableKeyComparator &);</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  };<span class="comment"></span></div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span> <span class="comment"> /// in sorted order.</span></div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01622"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6"> 1622</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> *v,</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  std::sort(v, v + len, TableKeyComparator<T>(buf_));</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  <span class="keywordflow">return</span> CreateVector(v, len);</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  }</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span> <span class="comment"></span></div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span> <span class="comment"> /// in sorted order.</span></div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01636"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135"> 1636</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  std::vector<<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a>> *v) {</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  <span class="keywordflow">return</span> CreateVectorOfSortedTables(data(*v), v->size());</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  }</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span> <span class="comment"></span></div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span> <span class="comment"> /// @param[in] elemsize The size of each element in the `vector`.</span></div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span> <span class="comment"> /// @param[out] buf A pointer to a `uint8_t` pointer that can be</span></div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> <span class="comment"> /// in the buffer.</span></div><div class="line"><a name="l01648"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c"> 1648</a></span> <span class="comment"></span> uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize,</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  uint8_t **buf) {</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  NotNested();</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  StartVector(len, elemsize);</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  buf_.make_space(len * elemsize);</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  <span class="keyword">auto</span> vec_start = GetSize();</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  <span class="keyword">auto</span> vec_end = EndVector(len);</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  *buf = buf_.data_at(vec_start);</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="keywordflow">return</span> vec_end;</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  }</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span> <span class="comment"></span></div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span> <span class="comment"> /// @tparam T The data type of the data that will be stored in the buffer</span></div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span> <span class="comment"> /// as a `vector`.</span></div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span> <span class="comment"> /// @param[out] buf A pointer to a pointer of type `T` that can be</span></div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span> <span class="comment"> /// in the buffer.</span></div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01668"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50"> 1668</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01669"></a><span class="lineno"> 1669</span>  AssertScalarT<T>();</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>  <span class="keywordflow">return</span> CreateUninitializedVector(len, <span class="keyword">sizeof</span>(T),</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>  reinterpret_cast<uint8_t **>(buf));</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  }</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> </div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T*></a>> CreateUninitializedVectorOfStructs(<span class="keywordtype">size_t</span> len, T **buf) {</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="keywordflow">return</span> CreateUninitializedVector(len, <span class="keyword">sizeof</span>(T),</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  reinterpret_cast<uint8_t **>(buf));</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  }</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span> <span class="comment"></span></div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span> <span class="comment"> /// @brief Write a struct by itself, typically to be part of a union.</span></div><div class="line"><a name="l01681"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8"> 1681</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<const T *></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8">CreateStruct</a>(<span class="keyword">const</span> T &structobj) {</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  NotNested();</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  Align(AlignOf<T>());</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>  buf_.push_small(structobj);</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<const T *></a>(GetSize());</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>  }</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span> <span class="comment"></span></div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span> <span class="comment"> /// @brief The length of a FlatBuffer file header.</span></div><div class="line"><a name="l01689"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19"> 1689</a></span> <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="l01690"></a><span class="lineno"> 1690</span> <span class="comment"></span></div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> <span class="comment"> /// @brief Finish serializing a buffer by writing the root offset.</span></div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span> <span class="comment"> /// @param[in] file_identifier If a `file_identifier` is given, the buffer</span></div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span> <span class="comment"> /// will be prefixed with a standard FlatBuffers file header.</span></div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01695"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912"> 1695</a></span>  <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<T></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="l01696"></a><span class="lineno"> 1696</span>  Finish(root.o, file_identifier, <span class="keyword">false</span>);</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  }</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span> <span class="comment"></span></div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> <span class="comment"> /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the</span></div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span> <span class="comment"> /// buffer following the size field). These buffers are NOT compatible</span></div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span> <span class="comment"> /// with standard buffers created by Finish, i.e. you can't call GetRoot</span></div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span> <span class="comment"> /// on them, you have to use GetSizePrefixedRoot instead.</span></div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span> <span class="comment"> /// All >32 bit quantities in this buffer will be aligned when the whole</span></div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span> <span class="comment"> /// size pre-fixed buffer is aligned.</span></div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span> <span class="comment"> /// These kinds of buffers are useful for creating a stream of FlatBuffers.</span></div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01707"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220"> 1707</a></span>  <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<T></a> root,</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  Finish(root.o, file_identifier, <span class="keyword">true</span>);</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  }</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span> </div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  <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> &);</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &operator=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &);</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span> </div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  <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="l01718"></a><span class="lineno"> 1718</span>  NotNested();</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  buf_.clear_scratch();</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  <span class="comment">// This will cause the whole buffer to be aligned.</span></div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  PreAlign((size_prefix ? <span class="keyword">sizeof</span>(uoffset_t) : 0) + <span class="keyword">sizeof</span>(uoffset_t) +</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  (file_identifier ? kFileIdentifierLength : 0),</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  minalign_);</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  <span class="keywordflow">if</span> (file_identifier) {</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength);</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>  PushBytes(reinterpret_cast<const uint8_t *>(file_identifier),</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  kFileIdentifierLength);</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  }</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  PushElement(ReferTo(root)); <span class="comment">// Location of root.</span></div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  <span class="keywordflow">if</span> (size_prefix) { PushElement(GetSize()); }</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  finished = <span class="keyword">true</span>;</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>  }</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span> </div><div class="line"><a name="l01734"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html"> 1734</a></span>  <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="l01735"></a><span class="lineno"> 1735</span>  uoffset_t off;</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  voffset_t id;</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  };</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span> </div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> buf_;</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span> </div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>  <span class="comment">// Accumulating offsets of table members while it is being built.</span></div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  <span class="comment">// We store these in the scratch pad of buf_, after the vtable offsets.</span></div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  uoffset_t num_field_loc;</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  <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="l01745"></a><span class="lineno"> 1745</span>  <span class="comment">// possible vtable.</span></div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  voffset_t max_voffset_;</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span> </div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  <span class="comment">// Ensure objects are not nested.</span></div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>  <span class="keywordtype">bool</span> nested;</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span> </div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>  <span class="comment">// Ensure the buffer is finished before it is being accessed.</span></div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  <span class="keywordtype">bool</span> finished;</div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> </div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  <span class="keywordtype">size_t</span> minalign_;</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span> </div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  <span class="keywordtype">bool</span> force_defaults_; <span class="comment">// Serialize values equal to their defaults anyway.</span></div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span> </div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  <span class="keywordtype">bool</span> dedup_vtables_;</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span> </div><div class="line"><a name="l01760"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html"> 1760</a></span>  <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="l01761"></a><span class="lineno"> 1761</span>  <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> &buf) : buf_(&buf) {}</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> &a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> &b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  <span class="keyword">auto</span> stra = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">></span>(buf_->data_at(a.o));</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  <span class="keyword">auto</span> strb = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">></span>(buf_->data_at(b.o));</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  <span class="keywordflow">return</span> strncmp(stra->c_str(), strb->c_str(),</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  (std::min)(stra->size(), strb->size()) + 1) < 0;</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  }</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  <span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> *buf_;</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  };</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span> </div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  <span class="comment">// For use with CreateSharedString. Instantiated on first use only.</span></div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <span class="keyword">typedef</span> std::set<Offset<String>, <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>> StringOffsetMap;</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  StringOffsetMap *string_pool;</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span> </div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  <span class="comment">// Allocates space for a vector of structures.</span></div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  <span class="comment">// Must be completed with EndVectorOfStructs().</span></div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T *StartVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  StartVector(vector_size * <span class="keyword">sizeof</span>(T) / AlignOf<T>(), AlignOf<T>());</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.make_space(vector_size * <span class="keyword">sizeof</span>(T)));</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  }</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span> </div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  <span class="comment">// End the vector of structues in the flatbuffers.</span></div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="comment">// Vector should have previously be started with StartVectorOfStructs().</span></div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> EndVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>>(EndVector(vector_size));</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  }</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span> };<span class="comment"></span></div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span> <span class="comment">/// @}</span></div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span> <span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> <span class="comment"></span><span class="comment">// Helpers to get a typed pointer to the root object contained in the buffer.</span></div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> T *GetMutableRoot(<span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  EndianCheck();</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  <span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(buf) +</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  EndianScalar(*reinterpret_cast<uoffset_t *>(buf)));</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span> }</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span> </div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  <span class="keywordflow">return</span> GetMutableRoot<T>(<span class="keyword">const_cast<</span><span class="keywordtype">void</span> *<span class="keyword">></span>(buf));</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span> }</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span> </div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetSizePrefixedRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <span class="keywordflow">return</span> GetRoot<T>(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(buf) + <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span> }</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span> <span class="comment"></span></div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span> <span class="comment">/// Helpers to get a typed pointer to objects that are currently being built.</span></div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span> <span class="comment">/// @warning Creating new objects will lead to reallocations and invalidates</span></div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span> <span class="comment">/// the pointer!</span></div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span> <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span> T *GetMutableTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> offset) {</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></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="l01815"></a><span class="lineno"> 1815</span>  offset.o);</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span> }</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span> </div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span> <span class="keyword">const</span> T *GetTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> offset) {</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  <span class="keywordflow">return</span> GetMutableTemporaryPointer<T>(fbb, offset);</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span> }</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span> <span class="comment"></span></div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span> <span class="comment">/// @brief Get a pointer to the the file_identifier section of the buffer.</span></div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span> <span class="comment">/// @return Returns a const char pointer to the start of the file_identifier</span></div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> <span class="comment">/// characters in the buffer. The returned char * has length</span></div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span> <span class="comment">/// 'flatbuffers::FlatBufferBuilder::kFileIdentifierLength'.</span></div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span> <span class="comment">/// This function is UNDEFINED for FlatBuffers whose schema does not include</span></div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span> <span class="comment">/// a file_identifier (likely points at padding or the start of a the root</span></div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span> <span class="comment">/// vtable).</span></div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span> <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="l01831"></a><span class="lineno"> 1831</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">></span>(buf) +</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  ((size_prefixed) ? 2 * <span class="keyword">sizeof</span>(uoffset_t) : <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span> }</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span> </div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span> <span class="comment">// Helper to see if the identifier in a buffer has the expected value.</span></div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> BufferHasIdentifier(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keyword">const</span> <span class="keywordtype">char</span> *identifier, <span class="keywordtype">bool</span> size_prefixed = <span class="keyword">false</span>) {</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  <span class="keywordflow">return</span> strncmp(GetBufferIdentifier(buf, size_prefixed), identifier,</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a>) == 0;</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span> }</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span> </div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span> <span class="comment">// Helper class to verify the integrity of a FlatBuffer</span></div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span> <span class="keyword">class </span>Verifier FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  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="l01845"></a><span class="lineno"> 1845</span>  uoffset_t _max_tables = 1000000)</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  : buf_(buf),</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  size_(buf_len),</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  depth_(0),</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  max_depth_(_max_depth),</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  num_tables_(0),</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  max_tables_(_max_tables)</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  , upper_bound_(0)</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  <span class="preprocessor">#endif</span></div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  {</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  assert(size_ < FLATBUFFERS_MAX_BUFFER_SIZE);</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  }</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span> </div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  <span class="comment">// Central location where any verification failures register.</span></div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  <span class="keywordtype">bool</span> Check(<span class="keywordtype">bool</span> ok)<span class="keyword"> const </span>{</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span> <span class="preprocessor"> #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE</span></div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  FLATBUFFERS_ASSERT(ok);</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  <span class="keywordflow">if</span> (!ok)</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  upper_bound_ = 0;</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  <span class="keywordflow">return</span> ok;</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  }</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span> </div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  <span class="comment">// Verify any range within the buffer.</span></div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  <span class="keywordtype">bool</span> Verify(<span class="keywordtype">size_t</span> elem, <span class="keywordtype">size_t</span> elem_len)<span class="keyword"> const </span>{</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  <span class="keyword">auto</span> upper_bound = elem + elem_len;</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  <span class="keywordflow">if</span> (upper_bound_ < upper_bound)</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  upper_bound_ = upper_bound;</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  <span class="keywordflow">return</span> Check(elem_len < size_ && elem <= size_ - elem_len);</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  }</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span> </div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyAlignment(<span class="keywordtype">size_t</span> elem)<span class="keyword"> const </span>{</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="keywordflow">return</span> (elem & (<span class="keyword">sizeof</span>(T) - 1)) == 0;</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  }</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span> </div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  <span class="comment">// Verify a range indicated by sizeof(T).</span></div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keywordtype">size_t</span> elem)<span class="keyword"> const </span>{</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <span class="keywordflow">return</span> VerifyAlignment<T>(elem) && Verify(elem, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  }</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span> </div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  <span class="comment">// Verify relative to a known-good base pointer.</span></div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> uint8_t *base, voffset_t elem_off, <span class="keywordtype">size_t</span> elem_len)<span class="keyword"> const </span>{</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  <span class="keywordflow">return</span> Verify(static_cast<size_t>(base - buf_) + elem_off, elem_len);</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  }</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span> </div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> uint8_t *base, voffset_t elem_off)<span class="keyword"></span></div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span> <span class="keyword"> const </span>{</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  <span class="keywordflow">return</span> Verify(static_cast<size_t>(base - buf_) + elem_off, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  }</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span> </div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  <span class="comment">// Verify a pointer (may be NULL) of a table type.</span></div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyTable(<span class="keyword">const</span> T *table) {</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  <span class="keywordflow">return</span> !table || table->Verify(*<span class="keyword">this</span>);</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  }</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span> </div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  <span class="comment">// Verify a pointer (may be NULL) of any vector type.</span></div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVector(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<T></a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  <span class="keywordflow">return</span> !vec || VerifyVectorOrString(reinterpret_cast<const uint8_t *>(vec),</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  }</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span> </div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  <span class="comment">// Verify a pointer (may be NULL) of a vector to struct.</span></div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVector(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<const T *></a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  <span class="keywordflow">return</span> VerifyVector(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector<T></a> *<span class="keyword">></span>(vec));</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  }</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span> </div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  <span class="comment">// Verify a pointer (may be NULL) to string.</span></div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  <span class="keywordtype">bool</span> VerifyString(<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="l01924"></a><span class="lineno"> 1924</span>  <span class="keywordtype">size_t</span> end;</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  <span class="keywordflow">return</span> !str ||</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  (VerifyVectorOrString(reinterpret_cast<const uint8_t *>(str),</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  1, &end) &&</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  Verify(end, 1) && <span class="comment">// Must have terminator</span></div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  Check(buf_[end] == <span class="charliteral">'\0'</span>)); <span class="comment">// Terminating byte must be 0.</span></div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  }</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span> </div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  <span class="comment">// Common code between vectors and strings.</span></div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="keywordtype">bool</span> VerifyVectorOrString(<span class="keyword">const</span> uint8_t *vec, <span class="keywordtype">size_t</span> elem_size,</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  <span class="keywordtype">size_t</span> *end = <span class="keyword">nullptr</span>)<span class="keyword"> const </span>{</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  <span class="keyword">auto</span> veco = <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(vec - buf_);</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  <span class="comment">// Check we can read the size field.</span></div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  <span class="keywordflow">if</span> (!Verify<uoffset_t>(veco)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <span class="comment">// Check the whole array. If this is a string, the byte past the array</span></div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  <span class="comment">// must be 0.</span></div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  <span class="keyword">auto</span> size = ReadScalar<uoffset_t>(vec);</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  <span class="keyword">auto</span> max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size;</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  <span class="keywordflow">if</span> (!Check(size < max_elems))</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Protect against byte_size overflowing.</span></div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  <span class="keyword">auto</span> byte_size = <span class="keyword">sizeof</span>(size) + elem_size * size;</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  <span class="keywordflow">if</span> (end) *end = veco + byte_size;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  <span class="keywordflow">return</span> Verify(veco, byte_size);</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  }</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span> </div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  <span class="comment">// Special case for string contents, after the above has been called.</span></div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  <span class="keywordtype">bool</span> VerifyVectorOfStrings(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a>> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="keywordflow">if</span> (!VerifyString(vec->Get(i))) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  }</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  }</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  }</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span> </div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>  <span class="comment">// Special case for table contents, after the above has been called.</span></div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVectorOfTables(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a>> *vec) {</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="keywordflow">if</span> (!vec->Get(i)->Verify(*<span class="keyword">this</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  }</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  }</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  }</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span> </div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  <span class="keywordtype">bool</span> VerifyTableStart(<span class="keyword">const</span> uint8_t *table) {</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>  <span class="comment">// Check the vtable offset.</span></div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="keyword">auto</span> tableo = <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(table - buf_);</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  <span class="keywordflow">if</span> (!Verify<soffset_t>(tableo)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  <span class="comment">// This offset may be signed, but doing the substraction unsigned always</span></div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>  <span class="comment">// gives the result we want.</span></div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  <span class="keyword">auto</span> vtableo = tableo - <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(ReadScalar<soffset_t>(table));</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  <span class="comment">// Check the vtable size field, then check vtable fits in its entirety.</span></div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  <span class="keywordflow">return</span> VerifyComplexity() && Verify<voffset_t>(vtableo) &&</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  VerifyAlignment<voffset_t>(ReadScalar<voffset_t>(buf_ + vtableo)) &&</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  Verify(vtableo, ReadScalar<voffset_t>(buf_ + vtableo));</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  }</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span> </div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  <span class="keywordtype">bool</span> VerifyBufferFromStart(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier, <span class="keywordtype">size_t</span> start) {</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  <span class="keywordflow">if</span> (identifier &&</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  (size_ < 2 * <span class="keyword">sizeof</span>(flatbuffers::uoffset_t) ||</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  !BufferHasIdentifier(buf_ + start, identifier))) {</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  }</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span> </div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  <span class="comment">// Call T::Verify, which must be in the generated code for this type.</span></div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <span class="keyword">auto</span> o = VerifyOffset(start);</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  <span class="keywordflow">return</span> o && <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>T *<span class="keyword">></span>(buf_ + start + o)->Verify(*<span class="keyword">this</span>)</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  && GetComputedSize()</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  <span class="preprocessor">#endif</span></div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  ;</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  }</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span> </div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  <span class="comment">// Verify this whole buffer, starting with root type T.</span></div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBuffer() { <span class="keywordflow">return</span> VerifyBuffer<T>(<span class="keyword">nullptr</span>); }</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span> </div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <span class="keywordflow">return</span> VerifyBufferFromStart<T>(identifier, 0);</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  }</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span> </div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifySizePrefixedBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <span class="keywordflow">return</span> Verify<uoffset_t>(0U) &&</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  ReadScalar<uoffset_t>(buf_) == size_ - <span class="keyword">sizeof</span>(uoffset_t) &&</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  VerifyBufferFromStart<T>(identifier, <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  }</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span> </div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  uoffset_t VerifyOffset(<span class="keywordtype">size_t</span> start)<span class="keyword"> const </span>{</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  <span class="keywordflow">if</span> (!Verify<uoffset_t>(start)) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  <span class="keyword">auto</span> o = ReadScalar<uoffset_t>(buf_ + start);</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  <span class="comment">// May not point to itself.</span></div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  Check(o != 0);</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  <span class="comment">// Can't wrap around / buffers are max 2GB.</span></div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  <span class="keywordflow">if</span> (!Check(static_cast<soffset_t>(o) >= 0)) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="comment">// Must be inside the buffer to create a pointer from it (pointer outside</span></div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <span class="comment">// buffer is UB).</span></div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  <span class="keywordflow">if</span> (!Verify(start + o, 1)) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  <span class="keywordflow">return</span> o;</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  }</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span> </div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  uoffset_t VerifyOffset(<span class="keyword">const</span> uint8_t *base, voffset_t start)<span class="keyword"> const </span>{</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  <span class="keywordflow">return</span> VerifyOffset(static_cast<size_t>(base - buf_) + start);</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  }</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span> </div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  <span class="comment">// Called at the start of a table to increase counters measuring data</span></div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <span class="comment">// structure depth and amount, and possibly bails out with false if</span></div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  <span class="comment">// limits set by the constructor have been hit. Needs to be balanced</span></div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="comment">// with EndTable().</span></div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  <span class="keywordtype">bool</span> VerifyComplexity() {</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  depth_++;</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  num_tables_++;</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  <span class="keywordflow">return</span> Check(depth_ <= max_depth_ && num_tables_ <= max_tables_);</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  }</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span> </div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <span class="comment">// Called at the end of a table to pop the depth count.</span></div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <span class="keywordtype">bool</span> EndTable() {</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  depth_--;</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  }</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span> </div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  <span class="comment">// Returns the message size in bytes</span></div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keywordtype">size_t</span> GetComputedSize()<span class="keyword"> const </span>{</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  uintptr_t size = upper_bound_;</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  <span class="comment">// Align the size to uoffset_t</span></div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  size = (size - 1 + <span class="keyword">sizeof</span>(uoffset_t)) & ~(<span class="keyword">sizeof</span>(uoffset_t) - 1);</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keywordflow">return</span> (size > size_) ? 0 : size;</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  }</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span> </div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  <span class="keyword">const</span> uint8_t *buf_;</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  <span class="keywordtype">size_t</span> size_;</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  uoffset_t depth_;</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  uoffset_t max_depth_;</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  uoffset_t num_tables_;</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  uoffset_t max_tables_;</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  <span class="keyword">mutable</span> <span class="keywordtype">size_t</span> upper_bound_;</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span> };</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span> </div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span> <span class="comment">// Convenient way to bundle a buffer and its length, to pass it around</span></div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span> <span class="comment">// typed by its root.</span></div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span> <span class="comment">// A BufferRef does not own its buffer.</span></div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span> <span class="keyword">struct </span>BufferRefBase {}; <span class="comment">// for std::is_base_of</span></div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>BufferRef : BufferRefBase {</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  BufferRef() : buf(<span class="keyword">nullptr</span>), len(0), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  BufferRef(uint8_t *_buf, uoffset_t _len)</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  : buf(_buf), len(_len), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span> </div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  ~BufferRef() {</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  <span class="keywordflow">if</span> (must_free) free(buf);</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  }</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span> </div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  <span class="keyword">const</span> T *GetRoot()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(buf); }</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span> </div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  <span class="keywordtype">bool</span> Verify() {</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  Verifier verifier(buf, len);</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  <span class="keywordflow">return</span> verifier.VerifyBuffer<T>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  }</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span> </div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  uint8_t *buf;</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  uoffset_t len;</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  <span class="keywordtype">bool</span> must_free;</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span> };</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span> </div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span> <span class="comment">// "structs" are flat structures that do not have an offset table, thus</span></div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span> <span class="comment">// always have all members present and do not support forwards/backwards</span></div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> <span class="comment">// compatible extensions.</span></div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span> </div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span> <span class="keyword">class </span>Struct FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  <span class="keywordflow">return</span> ReadScalar<T>(&data_[o]);</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  }</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span> </div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetStruct(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T<span class="keyword">></span>(&data_[o]);</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  }</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span> </div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(uoffset_t o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &data_[o]; }</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  uint8_t *GetAddressOf(uoffset_t o) { <span class="keywordflow">return</span> &data_[o]; }</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span> </div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  uint8_t data_[1];</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span> };</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> </div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span> <span class="comment">// "tables" use an offset table (possibly shared) that allows fields to be</span></div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span> <span class="comment">// omitted and added at will, but uses an extra indirection to read.</span></div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span> <span class="keyword">class </span>Table {</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  <span class="keyword">const</span> uint8_t *GetVTable()<span class="keyword"> const </span>{</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  <span class="keywordflow">return</span> data_ - ReadScalar<soffset_t>(data_);</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  }</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span> </div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  <span class="comment">// This gets the field offset for any of the functions below it, or 0</span></div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  <span class="comment">// if the field was not present.</span></div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  voffset_t GetOptionalFieldOffset(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  <span class="comment">// The vtable offset is always at the start.</span></div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  <span class="keyword">auto</span> vtable = GetVTable();</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  <span class="comment">// The first element is the size of the vtable (fields + type id + itself).</span></div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  <span class="keyword">auto</span> vtsize = ReadScalar<voffset_t>(vtable);</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  <span class="comment">// If the field we're accessing is outside the vtable, we're reading older</span></div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  <span class="comment">// data, so it's the same as if the offset was 0 (not present).</span></div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  <span class="keywordflow">return</span> field < vtsize ? ReadScalar<voffset_t>(vtable + field) : 0;</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  }</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span> </div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(voffset_t field, T defaultval)<span class="keyword"> const </span>{</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  <span class="keywordflow">return</span> field_offset ? ReadScalar<T>(data_ + field_offset) : defaultval;</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>  }</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span> </div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field) {</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  <span class="keyword">auto</span> p = data_ + field_offset;</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p + ReadScalar<uoffset_t>(p))</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  }</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetPointer<P>(field);</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  }</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> </div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetStruct(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>  <span class="keyword">auto</span> p = <span class="keyword">const_cast<</span>uint8_t *<span class="keyword">></span>(data_ + field_offset);</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>  <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p) : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  }</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span> </div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> SetField(voffset_t field, T val, T def) {</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> val == def;</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  WriteScalar(data_ + field_offset, val);</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  }</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span> </div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>  <span class="keywordtype">bool</span> SetPointer(voffset_t field, <span class="keyword">const</span> uint8_t *val) {</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  WriteScalar(data_ + field_offset,</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  static_cast<uoffset_t>(val - (data_ + field_offset)));</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  }</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span> </div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  uint8_t *GetAddressOf(voffset_t field) {</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  <span class="keywordflow">return</span> field_offset ? data_ + field_offset : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  }</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetAddressOf(field);</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  }</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span> </div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  <span class="keywordtype">bool</span> CheckField(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  <span class="keywordflow">return</span> GetOptionalFieldOffset(field) != 0;</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  }</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span> </div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  <span class="comment">// Verify the vtable of this table.</span></div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  <span class="comment">// Call this once per table, followed by VerifyField once per field.</span></div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  <span class="keywordtype">bool</span> VerifyTableStart(Verifier &verifier)<span class="keyword"> const </span>{</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>  <span class="keywordflow">return</span> verifier.VerifyTableStart(data_);</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  }</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span> </div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  <span class="comment">// Verify a particular field.</span></div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  <span class="keywordtype">bool</span> VerifyField(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  <span class="comment">// Calling GetOptionalFieldOffset should be safe now thanks to</span></div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="comment">// VerifyTable().</span></div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="comment">// Check the actual field.</span></div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  <span class="keywordflow">return</span> !field_offset || verifier.Verify<T>(data_, field_offset);</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>  }</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span> </div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  <span class="comment">// VerifyField for required fields.</span></div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  <span class="keywordtype">bool</span> VerifyFieldRequired(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &&</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  verifier.Verify<T>(data_, field_offset);</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  }</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span> </div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="comment">// Versions for offsets.</span></div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  <span class="keywordtype">bool</span> VerifyOffset(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  <span class="keywordflow">return</span> !field_offset || verifier.VerifyOffset(data_, field_offset);</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  }</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span> </div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  <span class="keywordtype">bool</span> VerifyOffsetRequired(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>  <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &&</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  verifier.VerifyOffset(data_, field_offset);</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  }</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span> </div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  <span class="comment">// private constructor & copy constructor: you obtain instances of this</span></div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  <span class="comment">// class by pointing to existing data only</span></div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>  Table();</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  Table(<span class="keyword">const</span> Table &other);</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span> </div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  uint8_t data_[1];</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span> };</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span> </div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> FlatBufferBuilder::Required(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> table,</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  voffset_t field) {</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  <span class="keyword">auto</span> table_ptr = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(buf_.data_at(table.o));</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  <span class="keywordtype">bool</span> ok = table_ptr->GetOptionalFieldOffset(field) != 0;</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  <span class="comment">// If this fails, the caller will show what field needs to be set.</span></div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  FLATBUFFERS_ASSERT(ok);</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  (void)ok;</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span> }</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span> <span class="comment"></span></div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span> <span class="comment">/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e.</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span> <span class="comment">/// it is the opposite transformation of GetRoot().</span></div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span> <span class="comment">/// This may be useful if you want to pass on a root and have the recipient</span></div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span> <span class="comment">/// delete the buffer afterwards.</span></div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span> <span class="comment"></span><span class="keyword">inline</span> <span class="keyword">const</span> uint8_t *GetBufferStartFromRootPointer(<span class="keyword">const</span> <span class="keywordtype">void</span> *root) {</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  <span class="keyword">auto</span> table = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(root);</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  <span class="keyword">auto</span> vtable = table->GetVTable();</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  <span class="comment">// Either the vtable is before the root or after the root.</span></div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="keyword">auto</span> start = (std::min)(vtable, reinterpret_cast<const uint8_t *>(root));</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  <span class="comment">// Align to at least sizeof(uoffset_t).</span></div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  start = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(<span class="keyword">reinterpret_cast<</span>uintptr_t<span class="keyword">></span>(start) &</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  ~(<span class="keyword">sizeof</span>(uoffset_t) - 1));</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <span class="comment">// Additionally, there may be a file_identifier in the buffer, and the root</span></div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  <span class="comment">// offset. The buffer may have been aligned to any size between</span></div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <span class="comment">// sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align").</span></div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  <span class="comment">// Sadly, the exact alignment is only known when constructing the buffer,</span></div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  <span class="comment">// since it depends on the presence of values with said alignment properties.</span></div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  <span class="comment">// So instead, we simply look at the next uoffset_t values (root,</span></div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  <span class="comment">// file_identifier, and alignment padding) to see which points to the root.</span></div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  <span class="comment">// None of the other values can "impersonate" the root since they will either</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  <span class="comment">// be 0 or four ASCII characters.</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  static_assert(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a> == <span class="keyword">sizeof</span>(uoffset_t),</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="stringliteral">"file_identifier is assumed to be the same size as uoffset_t"</span>);</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> possible_roots = FLATBUFFERS_MAX_ALIGNMENT / <span class="keyword">sizeof</span>(uoffset_t) + 1;</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  possible_roots; possible_roots--) {</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  start -= <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  <span class="keywordflow">if</span> (ReadScalar<uoffset_t>(start) + start ==</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(root))</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  <span class="keywordflow">return</span> start;</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  }</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  <span class="comment">// We didn't find the root, either the "root" passed isn't really a root,</span></div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>  <span class="comment">// or the buffer is corrupt.</span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <span class="comment">// Assert, because calling this function with bad data may cause reads</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="comment">// outside of buffer boundaries.</span></div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  FLATBUFFERS_ASSERT(<span class="keyword">false</span>);</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span> }</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span> <span class="comment"></span></div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span> <span class="comment">/// @brief This return the prefixed size of a FlatBuffer.</span></div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span> <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<uoffset_t>(buf); }</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span> </div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span> <span class="comment">// Base class for native objects (FlatBuffer data de-serialized into native</span></div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span> <span class="comment">// C++ data structures).</span></div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span> <span class="comment">// Contains no functionality, purely documentative.</span></div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span> <span class="keyword">struct </span>NativeTable {};</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span> <span class="comment"></span></div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span> <span class="comment">/// @brief Function types to be used with resolving hashes into objects and</span></div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span> <span class="comment">/// back again. The resolver gets a pointer to a field inside an object API</span></div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span> <span class="comment">/// object that is of the type specified in the schema using the attribute</span></div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span> <span class="comment">/// `cpp_type` (it is thus important whatever you write to this address</span></div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span> <span class="comment">/// matches that type). The value of this field is initially null, so you</span></div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span> <span class="comment">/// may choose to implement a delayed binding lookup using this function</span></div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span> <span class="comment">/// if you wish. The resolver does the opposite lookup, for when the object</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span> <span class="comment">/// is being serialized again.</span></div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span> <span class="comment"></span><span class="keyword">typedef</span> uint64_t hash_value_t;</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span> <span class="preprocessor">#ifdef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  <span class="keyword">typedef</span> void (*resolver_function_t)(<span class="keywordtype">void</span> **pointer_adr, hash_value_t hash);</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  <span class="keyword">typedef</span> hash_value_t (*rehasher_function_t)(<span class="keywordtype">void</span> *pointer);</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  <span class="keyword">typedef</span> std::function<void (void **pointer_adr, hash_value_t hash)></div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  resolver_function_t;</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <span class="keyword">typedef</span> std::function<hash_value_t (void *pointer)> rehasher_function_t;</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span> </div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span> <span class="comment">// Helper function to test if a field is present, using any of the field</span></div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span> <span class="comment">// enums in the generated code.</span></div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span> <span class="comment">// `table` must be a generated table type. Since this is a template parameter,</span></div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span> <span class="comment">// this is not typechecked to be a subclass of Table, so beware!</span></div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span> <span class="comment">// Note: this function will return false for fields equal to the default</span></div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span> <span class="comment">// value, since they're not stored in the buffer (unless force_defaults was</span></div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span> <span class="comment">// used).</span></div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> IsFieldPresent(<span class="keyword">const</span> T *table, voffset_t field) {</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>  <span class="comment">// Cast, since Table is a private baseclass of any table types.</span></div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(table)->CheckField(field);</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span> }</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span> </div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span> <span class="comment">// Utility function for reverse lookups on the EnumNames*() functions</span></div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span> <span class="comment">// (in the generated C++ code)</span></div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span> <span class="comment">// names must be NULL terminated.</span></div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> LookupEnum(<span class="keyword">const</span> <span class="keywordtype">char</span> **names, <span class="keyword">const</span> <span class="keywordtype">char</span> *name) {</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> **p = names; *p; p++)</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  <span class="keywordflow">if</span> (!strcmp(*p, name)) <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(p - names);</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span> }</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span> </div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span> <span class="comment">// These macros allow us to layout a struct with a guarantee that they'll end</span></div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span> <span class="comment">// up looking the same on different compilers and platforms.</span></div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span> <span class="comment">// It does this by disallowing the compiler to do any padding, and then</span></div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span> <span class="comment">// does padding itself by inserting extra padding fields that make every</span></div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span> <span class="comment">// element aligned to its own size.</span></div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span> <span class="comment">// Additionally, it manually sets the alignment of the struct as a whole,</span></div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span> <span class="comment">// which is typically its largest element, or a custom size set in the schema</span></div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span> <span class="comment">// by the force_align attribute.</span></div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span> <span class="comment">// These are used in the generated code only.</span></div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span> </div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span> <span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span> <span class="preprocessor"> #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span> <span class="preprocessor"> __pragma(pack(1)); \</span></div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span> <span class="preprocessor"> struct __declspec(align(alignment))</span></div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span> <span class="preprocessor"> #define FLATBUFFERS_STRUCT_END(name, size) \</span></div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span> <span class="preprocessor"> __pragma(pack()); \</span></div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span> <span class="preprocessor">#elif defined(__GNUC__) || defined(__clang__)</span></div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span> <span class="preprocessor"> #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span> <span class="preprocessor"> _Pragma("pack(1)") \</span></div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span> <span class="preprocessor"> struct __attribute__((aligned(alignment)))</span></div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span> <span class="preprocessor"> #define FLATBUFFERS_STRUCT_END(name, size) \</span></div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span> <span class="preprocessor"> _Pragma("pack()") \</span></div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span> <span class="preprocessor"> #error Unknown compiler, please define structure alignment macros</span></div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span> </div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span> <span class="comment">// Minimal reflection via code generation.</span></div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span> <span class="comment">// Besides full-fat reflection (see reflection.h) and parsing/printing by</span></div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span> <span class="comment">// loading schemas (see idl.h), we can also have code generation for mimimal</span></div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span> <span class="comment">// reflection data which allows pretty-printing and other uses without needing</span></div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span> <span class="comment">// a schema or a parser.</span></div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span> <span class="comment">// Generate code with --reflect-types (types only) or --reflect-names (names</span></div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span> <span class="comment">// also) to enable.</span></div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span> <span class="comment">// See minireflect.h for utilities using this functionality.</span></div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span> </div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> <span class="comment">// These types are organized slightly differently as the ones in idl.h.</span></div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span> <span class="keyword">enum</span> SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM };</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span> </div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span> <span class="comment">// Scalars have the same order as in idl.h</span></div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span> <span class="preprocessor">#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \</span></div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span> <span class="preprocessor"> ET(ET_UTYPE) \</span></div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span> <span class="preprocessor"> ET(ET_BOOL) \</span></div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span> <span class="preprocessor"> ET(ET_CHAR) \</span></div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span> <span class="preprocessor"> ET(ET_UCHAR) \</span></div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span> <span class="preprocessor"> ET(ET_SHORT) \</span></div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span> <span class="preprocessor"> ET(ET_USHORT) \</span></div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span> <span class="preprocessor"> ET(ET_INT) \</span></div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span> <span class="preprocessor"> ET(ET_UINT) \</span></div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span> <span class="preprocessor"> ET(ET_LONG) \</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span> <span class="preprocessor"> ET(ET_ULONG) \</span></div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span> <span class="preprocessor"> ET(ET_FLOAT) \</span></div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span> <span class="preprocessor"> ET(ET_DOUBLE) \</span></div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span> <span class="preprocessor"> ET(ET_STRING) \</span></div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> <span class="preprocessor"> ET(ET_SEQUENCE) // See SequenceType.</span></div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span> </div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span> <span class="keyword">enum</span> ElementaryType {</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> <span class="preprocessor"> #define FLATBUFFERS_ET(E) E,</span></div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>  FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span> };</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span> </div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span> <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="l02395"></a><span class="lineno"> 2395</span>  <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="l02396"></a><span class="lineno"> 2396</span> <span class="preprocessor"> #define FLATBUFFERS_ET(E) #E,</span></div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>  FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  };</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  <span class="keywordflow">return</span> names;</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span> }</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span> </div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span> <span class="comment">// Basic type info cost just 16bits per field!</span></div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span> <span class="keyword">struct </span>TypeCode {</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  uint16_t base_type : 4; <span class="comment">// ElementaryType</span></div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  uint16_t is_vector : 1;</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  int16_t sequence_ref : 11; <span class="comment">// Index into type_refs below, or -1 for none.</span></div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span> };</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span> </div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span> static_assert(<span class="keyword">sizeof</span>(TypeCode) == 2, <span class="stringliteral">"TypeCode"</span>);</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span> </div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span> <span class="keyword">struct </span>TypeTable;</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span> </div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span> <span class="comment">// Signature of the static method present in each type.</span></div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span> <span class="keyword">typedef</span> <span class="keyword">const</span> TypeTable *(*TypeFunction)();</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span> </div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span> <span class="keyword">struct </span>TypeTable {</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>  SequenceType st;</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  <span class="keywordtype">size_t</span> num_elems; <span class="comment">// of type_codes, values, names (but not type_refs).</span></div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  <span class="keyword">const</span> TypeCode *type_codes; <span class="comment">// num_elems count</span></div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  <span class="keyword">const</span> TypeFunction *type_refs; <span class="comment">// less than num_elems entries (see TypeCode).</span></div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  <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="l02424"></a><span class="lineno"> 2424</span>  <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="l02425"></a><span class="lineno"> 2425</span> };</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span> </div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span> <span class="comment">// String which identifies the current version of FlatBuffers.</span></div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span> <span class="comment">// flatbuffer_version_string is used by Google developers to identify which</span></div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span> <span class="comment">// applications uploaded to Google Play are using this library. This allows</span></div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span> <span class="comment">// the development team at Google to determine the popularity of the library.</span></div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span> <span class="comment">// How it works: Applications that are uploaded to the Google Play Store are</span></div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span> <span class="comment">// scanned for this version string. We track which applications are using it</span></div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span> <span class="comment">// to measure popularity. You are free to remove it (of course) but we would</span></div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span> <span class="comment">// appreciate if you left it in.</span></div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span> </div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span> <span class="comment">// Weak linkage is culled by VS & doesn't work on cygwin.</span></div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span> <span class="preprocessor">#if !defined(_WIN32) && !defined(__CYGWIN__)</span></div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> </div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> <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="l02441"></a><span class="lineno"> 2441</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="l02442"></a><span class="lineno"> 2442</span>  <span class="stringliteral">"FlatBuffers "</span></div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) <span class="stringliteral">"."</span></div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) <span class="stringliteral">"."</span></div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span> </div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span> <span class="preprocessor">#endif // !defined(_WIN32) && !defined(__CYGWIN__)</span></div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span> </div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span> <span class="preprocessor">#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\</span></div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span> <span class="preprocessor"> inline E operator | (E lhs, E rhs){\</span></div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span> <span class="preprocessor"> return E(T(lhs) | T(rhs));\</span></div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span> <span class="preprocessor"> inline E operator & (E lhs, E rhs){\</span></div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span> <span class="preprocessor"> return E(T(lhs) & T(rhs));\</span></div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span> <span class="preprocessor"> inline E operator ^ (E lhs, E rhs){\</span></div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span> <span class="preprocessor"> return E(T(lhs) ^ T(rhs));\</span></div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span> <span class="preprocessor"> inline E operator ~ (E lhs){\</span></div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span> <span class="preprocessor"> return E(~T(lhs));\</span></div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span> <span class="preprocessor"> inline E operator |= (E &lhs, E rhs){\</span></div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span> <span class="preprocessor"> lhs = lhs | rhs;\</span></div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span> <span class="preprocessor"> return lhs;\</span></div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span> <span class="preprocessor"> inline E operator &= (E &lhs, E rhs){\</span></div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span> <span class="preprocessor"> lhs = lhs & rhs;\</span></div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span> <span class="preprocessor"> return lhs;\</span></div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span> <span class="preprocessor"> inline E operator ^= (E &lhs, E rhs){\</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span> <span class="preprocessor"> lhs = lhs ^ rhs;\</span></div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span> <span class="preprocessor"> return lhs;\</span></div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span> <span class="preprocessor"> inline bool operator !(E rhs) \</span></div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span> <span class="preprocessor"> {\</span></div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span> <span class="preprocessor"> return !bool(T(rhs)); \</span></div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span> <span class="preprocessor"> }</span></div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span> <span class="comment">/// @endcond</span></div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span> <span class="comment"></span>} <span class="comment">// namespace flatbuffers</span></div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span> </div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span> <span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span> <span class="preprocessor"> #pragma warning(pop)</span></div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span> </div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span> <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< Vector< T > > CreateVector(size_t vector_size, const std::function< T(size_t i)> &f)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1390</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:1648</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a6e90ada59d9553636f72ce8e4a892f72"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(size_t vector_size, const std::function< void(size_t i, T *)> &filler)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1470</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< Vector< const T * > > 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:1574</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< Vector< const T * > > CreateVectorOfSortedNativeStructs(std::vector< S > *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:1560</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:901</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac64d11c219559ea51567eab556e13135"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(std::vector< Offset< T >> *v)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1636</div></div> +<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Copyright 2014 Google Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * Licensed under the Apache License, Version 2.0 (the "License");</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <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> <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> <span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <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> <span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <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> <span class="comment"> * distributed under the License is distributed on an "AS IS" BASIS,</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <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> <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> <span class="comment"> * limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment"> */</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#ifndef FLATBUFFERS_H_</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#define FLATBUFFERS_H_</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include "flatbuffers/base.h"</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <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> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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>  uoffset_t o;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <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>  <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>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<void></a> Union()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<void></a>(o); }</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <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> };</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> EndianCheck() {</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordtype">int</span> endiantest = 1;</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="comment">// If this fails, see FLATBUFFERS_LITTLEENDIAN above.</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  FLATBUFFERS_ASSERT(*reinterpret_cast<char *>(&endiantest) ==</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  FLATBUFFERS_LITTLEENDIAN);</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  (void)endiantest;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> }</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> FLATBUFFERS_CONSTEXPR <span class="keywordtype">size_t</span> AlignOf() {</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor"> #ifdef _MSC_VER</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <span class="keywordflow">return</span> __alignof(T);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="preprocessor"> #ifndef alignof</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keywordflow">return</span> __alignof__(T);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keywordflow">return</span> <span class="keyword">alignof</span>(T);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> }</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <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> <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> <span class="comment">// perform the indirection and return a pointer.</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment">// The template specialization below does just that.</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment">// It is wrapped in a struct since function templates can't overload on the</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment">// return type like this.</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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>  <span class="keyword">typedef</span> T return_type;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="keyword">typedef</span> T mutable_return_type;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <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>  <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>  <span class="keywordflow">return</span> EndianScalar((reinterpret_cast<const T *>(p))[i]);</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  }</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> };</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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset</a><T>> {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <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>  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <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>  <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>  p += i * <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>return_type<span class="keyword">></span>(p + ReadScalar<uoffset_t>(p));</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  }</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> };</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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a><const T *> {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <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>  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <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>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>T *<span class="keyword">></span>(p + i * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  }</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> };</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> IT> <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>  <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>  <span class="keyword">typedef</span> IT value_type;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keyword">typedef</span> ptrdiff_t difference_type;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keyword">typedef</span> IT *pointer;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keyword">typedef</span> IT &reference;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <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>  : data_(data + <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a> * i) {}</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <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> &other) : data_(other.data_) {}</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other) {</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  data_ = other.data_;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  }</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator=(<a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &&other) {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  data_ = other.data_;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  }</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">return</span> data_ == other.data_;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  }</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> </div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordtype">bool</span> operator<(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">return</span> data_ < other.data_;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  }</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">return</span> data_ != other.data_;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  difference_type operator-(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">return</span> (data_ - other.data_) / <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  IT operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(data_, 0); }</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  IT operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(data_, 0); }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator++() {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <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>  <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>  data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  }</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> </div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator+(<span class="keyword">const</span> uoffset_t &offset)<span class="keyword"> const </span>{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <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<T>::element_stride</a>,</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  0);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator+=(<span class="keyword">const</span> uoffset_t &offset) {</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  data_ += offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  }</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator--() {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  }</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <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>  <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>  data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator-(<span class="keyword">const</span> uoffset_t &offset) {</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <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<T>::element_stride</a>,</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  0);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  }</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &operator-=(<span class="keyword">const</span> uoffset_t &offset) {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  data_ -= offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  }</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> </div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keyword">const</span> uint8_t *data_;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> };</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> </div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> <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> </div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <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> <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> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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>  <span class="keyword">public</span>:</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator<T, typename IndirectHelper<T>::mutable_return_type</a>></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <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>  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator<T, typename IndirectHelper<T>::return_type</a>></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <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> </div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  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> </div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// Deprecated: use size(). Here for backwards compatibility.</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  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> </div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper<T>::return_type return_type;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper<T>::mutable_return_type mutable_return_type;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> </div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  return_type Get(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(Data(), i);</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  }</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  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> </div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <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>  <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>  <span class="comment">// type E.</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keyword">template</span><<span class="keyword">typename</span> E> E GetEnum(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>E<span class="keyword">></span>(Get(i));</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="comment">// If this a vector of unions, this does the cast for you. There's no check</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <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>  <span class="keyword">template</span><<span class="keyword">typename</span> U> <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>U *<span class="keyword">></span>(Get(i));</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> </div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="comment">// If this a vector of unions, this does the cast for you. There's no check</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <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>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">></span>(Get(i));</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  }</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">void</span> *<span class="keyword">></span>(Data() + o);</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> </div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  iterator begin() { <span class="keywordflow">return</span> iterator(Data(), 0); }</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  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> </div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  iterator end() { <span class="keywordflow">return</span> iterator(Data(), size()); }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  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> </div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <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>  <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>  <span class="keywordtype">void</span> Mutate(uoffset_t i, <span class="keyword">const</span> T &val) {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  WriteScalar(data() + i, val);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <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>  <span class="comment">// "val" 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>  <span class="comment">// e.g. reflection::AddFlatBuffer().</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <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>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  static_assert(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(uoffset_t), <span class="stringliteral">"Unrelated types"</span>);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  WriteScalar(data() + i,</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  static_cast<uoffset_t>(val - (Data() + i * <span class="keyword">sizeof</span>(uoffset_t))));</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <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>  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>  FLATBUFFERS_ASSERT(i < size());</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>mutable_return_type<span class="keyword">></span>(<a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(Data(), i));</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <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>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(&length_ + 1);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> </div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(&length_ + 1); }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <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>  <span class="keyword">const</span> T *data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>T *<span class="keyword">></span>(Data()); }</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  T *data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(Data()); }</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> </div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keyword">template</span><<span class="keyword">typename</span> K> return_type LookupByKey(K key)<span class="keyword"> const </span>{</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="keywordtype">void</span> *search_result = std::bsearch(</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  &key, Data(), size(), <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::element_stride</a>, KeyCompare<K>);</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">if</span> (!search_result) {</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <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>  }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> </div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> uint8_t *element = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(search_result);</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> </div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(element, 0);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="comment">// This class is only used to access pre-existing data. Don't ever</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="comment">// try to construct these manually.</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>();</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> </div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  uoffset_t length_;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> </div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <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>  <span class="comment">// Private and unimplemented copy constructor.</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <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> &);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> </div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keyword">template</span><<span class="keyword">typename</span> K> <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>  <span class="keyword">const</span> K *key = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>K *<span class="keyword">></span>(ap);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keyword">const</span> uint8_t *data = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(bp);</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keyword">auto</span> table = <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper<T>::Read</a>(data, 0);</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <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>  <span class="comment">// result here.</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">return</span> -table->KeyCompareWithValue(*key);</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> };</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> </div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> <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> <span class="comment">// don'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> <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>  <span class="keyword">public</span>:</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  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> </div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <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>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(&length_ + 1);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  }</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(&length_ + 1); }</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> </div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <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> </div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  uoffset_t length_;</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span> </div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <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> &);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> };</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <span class="preprocessor">#ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a>> *VectorCast(<a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<U></a>> *ptr) {</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  static_assert(std::is_base_of<T, U>::value, <span class="stringliteral">"Unrelated types"</span>);</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a><span class="keyword">></span> *>(ptr);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span> }</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> </div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a>> *VectorCast(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<U></a>> *ptr) {</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  static_assert(std::is_base_of<T, U>::value, <span class="stringliteral">"Unrelated types"</span>);</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector<Offset<T></a><span class="keyword">></span> *>(ptr);</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> }</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> </div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <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> <span class="comment">// of whether it is null or not (the field is not set).</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <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<T></a> *v) {</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">return</span> v ? v->Length() : 0;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> </div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_string.html"> 343</a></span> <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><char> {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <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<</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">></span>(Data()); }</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  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> </div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="preprocessor"> #ifdef FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  flatbuffers::string_view string_view()<span class="keyword"> const </span>{</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="keywordflow">return</span> flatbuffers::string_view(c_str(), Length());</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> <span class="preprocessor"> #endif // FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> </div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordtype">bool</span> operator<(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> &o)<span class="keyword"> const </span>{</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordflow">return</span> strcmp(c_str(), o.c_str()) < 0;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> };</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> <span class="comment">// Convenience function to get std::string from a String returning an empty</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> <span class="comment">// string on null pointer.</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> <span class="keyword">static</span> <span class="keyword">inline</span> std::string GetString(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> * str) {</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">return</span> str ? str->str() : <span class="stringliteral">""</span>;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> }</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> <span class="comment">// Convenience function to get char* from a String returning an empty string on</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> <span class="comment">// null pointer.</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * GetCstring(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> * str) {</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">return</span> str ? str->c_str() : <span class="stringliteral">""</span>;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> }</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> </div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> <span class="comment">// Allocator interface. This is flatbuffers-specific and meant only for</span></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> <span class="comment">// `vector_downward` usage.</span></div><div class="line"><a name="l00374"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_allocator.html"> 374</a></span> <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> {</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keyword">virtual</span> ~<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a>() {}</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="comment">// Allocate `size` bytes of memory.</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keyword">virtual</span> uint8_t *allocate(<span class="keywordtype">size_t</span> size) = 0;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> </div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="comment">// Deallocate `size` bytes of memory at `p` allocated by this allocator.</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <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="l00383"></a><span class="lineno"> 383</span> </div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="comment">// Reallocate `new_size` bytes of memory, replacing the old region of size</span></div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// `old_size` at `p`. In contrast to a normal realloc, this grows downwards,</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// and is intended specifcally for `vector_downward` use.</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="comment">// `in_use_back` and `in_use_front` indicate how much of `old_size` is</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="comment">// actually in use at each end, and needs to be copied.</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <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="l00390"></a><span class="lineno"> 390</span>  <span class="keywordtype">size_t</span> new_size, <span class="keywordtype">size_t</span> in_use_back,</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  FLATBUFFERS_ASSERT(new_size > old_size); <span class="comment">// vector_downward only grows</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  uint8_t *new_p = allocate(new_size);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  in_use_front);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  deallocate(old_p, old_size);</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordflow">return</span> new_p;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> </div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="comment">// Called by `reallocate_downward` to copy memory from `old_p` of `old_size`</span></div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="comment">// to `new_p` of `new_size`. Only memory of size `in_use_front` and</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <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="l00404"></a><span class="lineno"> 404</span>  <span class="comment">// allocation.</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <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="l00406"></a><span class="lineno"> 406</span>  uint8_t *new_p, <span class="keywordtype">size_t</span> new_size,</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keywordtype">size_t</span> in_use_back, <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back,</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  in_use_back);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  memcpy(new_p, old_p, in_use_front);</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span> };</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> </div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span> <span class="comment">// DefaultAllocator uses new/delete to allocate memory regions</span></div><div class="line"><a name="l00415"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_default_allocator.html"> 415</a></span> <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="l00416"></a><span class="lineno"> 416</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  uint8_t *allocate(<span class="keywordtype">size_t</span> size) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> uint8_t[size];</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  }</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keywordtype">void</span> deallocate(uint8_t *p, <span class="keywordtype">size_t</span>) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keyword">delete</span>[] p;</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  }</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> };</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> </div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span> <span class="comment">// These functions allow for a null allocator to mean use the default allocator,</span></div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span> <span class="comment">// as used by DetachedBuffer and vector_downward below.</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span> <span class="comment">// This is to avoid having a statically or dynamically allocated default</span></div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span> <span class="comment">// allocator, or having to move it between the classes that may own it.</span></div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> <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="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">return</span> allocator ? allocator->allocate(size)</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  : <a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a>().allocate(size);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span> }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> </div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span> <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="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">if</span> (allocator) allocator->deallocate(p, size);</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <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="l00438"></a><span class="lineno"> 438</span> }</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> </div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> <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="l00441"></a><span class="lineno"> 441</span>  <span class="keywordtype">size_t</span> old_size, <span class="keywordtype">size_t</span> new_size,</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordtype">size_t</span> in_use_back, <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">return</span> allocator</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  ? allocator->reallocate_downward(old_p, old_size, new_size,</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  in_use_back, in_use_front)</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  : <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="l00447"></a><span class="lineno"> 447</span>  in_use_back, in_use_front);</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span> }</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> </div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span> <span class="comment">// DetachedBuffer is a finished flatbuffer memory region, detached from its</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span> <span class="comment">// builder. The original memory region and allocator are also stored so that</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span> <span class="comment">// the DetachedBuffer can manage the memory lifetime.</span></div><div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_detached_buffer.html"> 453</a></span> <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> {</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>()</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  : allocator_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  own_allocator_(<span class="keyword">false</span>),</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  reserved_(0),</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  size_(0) {}</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> </div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <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="l00464"></a><span class="lineno"> 464</span>  <span class="keywordtype">size_t</span> reserved, uint8_t *cur, <span class="keywordtype">size_t</span> sz)</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  : allocator_(allocator),</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  own_allocator_(own_allocator),</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  buf_(buf),</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  reserved_(reserved),</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  cur_(cur),</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  size_(sz) {}</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> </div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &&other)</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  : allocator_(other.allocator_),</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  own_allocator_(other.own_allocator_),</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  buf_(other.buf_),</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  reserved_(other.reserved_),</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  cur_(other.cur_),</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  size_(other.size_) {</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  other.reset();</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  }</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> </div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &operator=(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &&other) {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  destroy();</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span> </div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  allocator_ = other.allocator_;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  own_allocator_ = other.own_allocator_;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  buf_ = other.buf_;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  reserved_ = other.reserved_;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  cur_ = other.cur_;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  size_ = other.size_;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span> </div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  other.reset();</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> </div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span> </div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  ~<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>() { destroy(); }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> </div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <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="l00500"></a><span class="lineno"> 500</span> </div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  uint8_t *data() { <span class="keywordflow">return</span> cur_; }</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size_; }</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> </div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span> <span class="preprocessor"> #if 0 // disabled for now due to the ordering of classes in this header</span></div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keyword">template</span> <<span class="keyword">class</span> T></div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordtype">bool</span> Verify()<span class="keyword"> const </span>{</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  Verifier verifier(data(), size());</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keywordflow">return</span> verifier.Verify<T>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  }</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span> </div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keyword">template</span> <<span class="keyword">class</span> T></div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keyword">const</span> T* GetRoot()<span class="keyword"> const </span>{</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(data());</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  }</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span> </div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keyword">template</span> <<span class="keyword">class</span> T></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  T* GetRoot() {</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(data());</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  }</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> </div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="comment">// These may change access mode, leave these at end of public section</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  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> &other))</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  FLATBUFFERS_DELETE_FUNC(</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &other))</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span> </div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  uint8_t *buf_;</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  uint8_t *cur_;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordtype">size_t</span> size_;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keyword">inline</span> <span class="keywordtype">void</span> destroy() {</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">if</span> (buf_) Deallocate(allocator_, buf_, reserved_);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordflow">if</span> (own_allocator_ && allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  reset();</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  }</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keyword">inline</span> <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  reserved_ = 0;</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  size_ = 0;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  }</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> };</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> </div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> <span class="comment">// This is a minimal replication of std::vector<uint8_t> functionality,</span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> <span class="comment">// except growing from higher to lower addresses. i.e push_back() inserts data</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> <span class="comment">// in the lowest address in the vector.</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="comment">// Since this vector leaves the lower part unused, we support a "scratch-pad"</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> <span class="comment">// that can be stored there for temporary data, to share the allocated space.</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> <span class="comment">// Essentially, this supports 2 std::vectors in a single buffer.</span></div><div class="line"><a name="l00560"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1vector__downward.html"> 560</a></span> <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> {</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <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="l00563"></a><span class="lineno"> 563</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator,</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordtype">bool</span> own_allocator,</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="keywordtype">size_t</span> buffer_minalign)</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  : allocator_(allocator),</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  own_allocator_(own_allocator),</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  initial_size_(initial_size),</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  buffer_minalign_(buffer_minalign),</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  reserved_(0),</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  scratch_(<span class="keyword">nullptr</span>) {}</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> </div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &&other)</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  : allocator_(other.allocator_),</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  own_allocator_(other.own_allocator_),</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  initial_size_(other.initial_size_),</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  buffer_minalign_(other.buffer_minalign_),</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  reserved_(other.reserved_),</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  buf_(other.buf_),</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  cur_(other.cur_),</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  scratch_(other.scratch_) {</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="comment">// No change in other.allocator_</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="comment">// No change in other.initial_size_</span></div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="comment">// No change in other.buffer_minalign_</span></div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  other.own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  other.reserved_ = 0;</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  other.buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  other.cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  other.scratch_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  }</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span> </div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &operator=(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &&other) {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="comment">// Move construct a temporary and swap idiom</span></div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> temp(std::move(other));</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  swap(temp);</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  }</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> </div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  ~<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>() {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  clear_buffer();</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  clear_allocator();</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span> </div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  clear_buffer();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  clear();</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  }</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> </div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordtype">void</span> clear() {</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  cur_ = buf_ + reserved_;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  reserved_ = 0;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  }</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  clear_scratch();</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  }</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> </div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keywordtype">void</span> clear_scratch() {</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  scratch_ = buf_;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordtype">void</span> clear_allocator() {</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordflow">if</span> (own_allocator_ && allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> </div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  <span class="keywordtype">void</span> clear_buffer() {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordflow">if</span> (buf_) Deallocate(allocator_, buf_, reserved_);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  }</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span> </div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="comment">// Relinquish the pointer to the caller.</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  uint8_t *release_raw(<span class="keywordtype">size_t</span> &allocated_bytes, <span class="keywordtype">size_t</span> &offset) {</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keyword">auto</span> *buf = buf_;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  allocated_bytes = reserved_;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  offset = <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(cur_ - buf_);</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> </div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="comment">// release_raw only relinquishes the buffer ownership.</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="comment">// Does not deallocate or reset the allocator. Destructor will do that.</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  clear();</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="keywordflow">return</span> buf;</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  }</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> </div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="comment">// Relinquish the pointer to the caller.</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> release() {</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="comment">// allocator ownership (if any) is transferred to DetachedBuffer.</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <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="l00653"></a><span class="lineno"> 653</span>  size());</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keywordflow">if</span> (own_allocator_) {</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  }</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  clear();</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="keywordflow">return</span> fb;</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  }</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span> </div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordtype">size_t</span> ensure_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_);</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordflow">if</span> (len > static_cast<size_t>(cur_ - scratch_)) { reallocate(len); }</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="comment">// Beyond this, signed offsets may not have enough range:</span></div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="comment">// (FlatBuffers > 2GB not supported).</span></div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  FLATBUFFERS_ASSERT(size() < FLATBUFFERS_MAX_BUFFER_SIZE);</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">return</span> len;</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  }</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keyword">inline</span> uint8_t *make_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keywordtype">size_t</span> space = ensure_space(len);</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  cur_ -= space;</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  }</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span> </div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="comment">// Returns nullptr if using the DefaultAllocator.</span></div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <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="l00680"></a><span class="lineno"> 680</span> </div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  uoffset_t size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(reserved_ - (cur_ - buf_));</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  }</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  uoffset_t scratch_size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(scratch_ - buf_);</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  }</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span> </div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordtype">size_t</span> capacity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> reserved_; }</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span> </div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  uint8_t *data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  FLATBUFFERS_ASSERT(cur_);</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  }</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span> </div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  uint8_t *scratch_data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  FLATBUFFERS_ASSERT(buf_);</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">return</span> buf_;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  }</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span> </div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  uint8_t *scratch_end()<span class="keyword"> const </span>{</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  FLATBUFFERS_ASSERT(scratch_);</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">return</span> scratch_;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  }</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span> </div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  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="l00707"></a><span class="lineno"> 707</span> </div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <span class="keywordtype">void</span> push(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> num) {</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  memcpy(make_space(num), bytes, num);</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  }</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="comment">// Specialized version of push() that avoids memcpy call for small data.</span></div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> push_small(<span class="keyword">const</span> T &little_endian_t) {</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  make_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  *<span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(cur_) = little_endian_t;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  }</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span> </div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> scratch_push_small(<span class="keyword">const</span> T &t) {</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  ensure_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  *<span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(scratch_) = t;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  scratch_ += <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  }</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span> </div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="comment">// fill() is most frequently called with small byte counts (<= 4),</span></div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="comment">// which is why we're using loops rather than calling memset.</span></div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="keywordtype">void</span> fill(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  make_space(zero_pad_bytes);</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < zero_pad_bytes; i++) cur_[i] = 0;</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  }</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span> </div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="comment">// Version for when we know the size is larger.</span></div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordtype">void</span> fill_big(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  memset(make_space(zero_pad_bytes), 0, zero_pad_bytes);</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> </div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keywordtype">void</span> pop(<span class="keywordtype">size_t</span> bytes_to_remove) { cur_ += bytes_to_remove; }</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <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="l00738"></a><span class="lineno"> 738</span> </div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="keywordtype">void</span> swap(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &other) {</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <span class="keyword">using</span> std::swap;</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  swap(allocator_, other.allocator_);</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  swap(own_allocator_, other.own_allocator_);</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  swap(initial_size_, other.initial_size_);</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  swap(buffer_minalign_, other.buffer_minalign_);</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  swap(reserved_, other.reserved_);</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  swap(buf_, other.buf_);</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  swap(cur_, other.cur_);</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  swap(scratch_, other.scratch_);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  }</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordtype">void</span> swap_allocator(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &other) {</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="keyword">using</span> std::swap;</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  swap(allocator_, other.allocator_);</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  swap(own_allocator_, other.own_allocator_);</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  }</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span> </div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  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> &))</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &))</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span> </div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <span class="keywordtype">size_t</span> initial_size_;</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  <span class="keywordtype">size_t</span> buffer_minalign_;</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  uint8_t *buf_;</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  uint8_t *cur_; <span class="comment">// Points at location between empty (below) and used (above).</span></div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  uint8_t *scratch_; <span class="comment">// Points to the end of the scratchpad in use.</span></div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span> </div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <span class="keywordtype">void</span> reallocate(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="keyword">auto</span> old_reserved = reserved_;</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="keyword">auto</span> old_size = size();</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="keyword">auto</span> old_scratch_size = scratch_size();</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  reserved_ += (std::max)(len,</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  old_reserved ? old_reserved / 2 : initial_size_);</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1);</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_,</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  old_size, old_scratch_size);</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  buf_ = Allocate(allocator_, reserved_);</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  }</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  cur_ = buf_ + reserved_ - old_size;</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  scratch_ = buf_ + old_scratch_size;</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  }</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span> };</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span> </div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span> <span class="comment">// Converts a Field ID to a virtual table offset.</span></div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span> <span class="keyword">inline</span> voffset_t FieldIndexToOffset(voffset_t field_id) {</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="comment">// Should correspond to what EndTable() below builds up.</span></div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> fixed_fields = 2; <span class="comment">// Vtable size and Object Size.</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>((field_id + fixed_fields) * <span class="keyword">sizeof</span>(voffset_t));</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span> }</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span> </div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc></div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span> <span class="keyword">const</span> T *data(<span class="keyword">const</span> std::vector<T, Alloc> &v) {</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="keywordflow">return</span> v.empty() ? nullptr : &v.front();</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span> }</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc> T *data(std::vector<T, Alloc> &v) {</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="keywordflow">return</span> v.empty() ? nullptr : &v.front();</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span> }</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span> <span class="comment"></span></div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span> <span class="comment">/// @endcond</span></div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> <span class="comment">/// @addtogroup flatbuffers_cpp_api</span></div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span> <span class="comment">/// @{</span></div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> <span class="comment">/// @class FlatBufferBuilder</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span> <span class="comment">/// @brief Helper class to hold data needed in creation of a FlatBuffer.</span></div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span> <span class="comment">/// To serialize data, you typically call one of the `Create*()` functions in</span></div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span> <span class="comment">/// the generated code, which in turn call a sequence of `StartTable`/</span></div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span> <span class="comment">/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/</span></div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span> <span class="comment">/// `CreateVector` functions. Do this is depth-first order to build up a tree to</span></div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span> <span class="comment">/// the root. `Finish()` wraps up the buffer ready for transport.</span></div><div class="line"><a name="l00815"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html"> 815</a></span> <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="l00816"></a><span class="lineno"> 816</span>  <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> <span class="comment"> /// @brief Default constructor for FlatBufferBuilder.</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> <span class="comment"> /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults</span></div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span> <span class="comment"> /// to `1024`.</span></div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> <span class="comment"> /// @param[in] allocator An `Allocator` to use. If null will use</span></div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span> <span class="comment"> /// `DefaultAllocator`.</span></div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span> <span class="comment"> /// @param[in] own_allocator Whether the builder/vector should own the</span></div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span> <span class="comment"> /// allocator. Defaults to / `false`.</span></div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span> <span class="comment"> /// @param[in] buffer_minalign Force the buffer to be aligned to the given</span></div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span> <span class="comment"> /// minimum alignment upon reallocation. Only needed if you intend to store</span></div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span> <span class="comment"> /// types with custom alignment AND you wish to read the buffer in-place</span></div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span> <span class="comment"> /// directly after creation.</span></div><div class="line"><a name="l00828"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c"> 828</a></span> <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="l00829"></a><span class="lineno"> 829</span>  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator = <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordtype">bool</span> own_allocator = <span class="keyword">false</span>,</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="keywordtype">size_t</span> buffer_minalign =</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  AlignOf<largest_scalar_t>())</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  : buf_(initial_size, allocator, own_allocator, buffer_minalign),</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  num_field_loc(0),</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  max_voffset_(0),</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  nested(false),</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  finished(false),</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  minalign_(1),</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  force_defaults_(false),</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  dedup_vtables_(true),</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  string_pool(nullptr) {</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  EndianCheck();</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  }</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span> <span class="comment"></span></div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span> <span class="comment"> /// @brief Move constructor for FlatBufferBuilder.</span></div><div class="line"><a name="l00846"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a86e1a348b7474fd5d239016ae97afc56"> 846</a></span> <span class="comment"></span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a86e1a348b7474fd5d239016ae97afc56">FlatBufferBuilder</a>(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &&other)</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  : buf_(1024, nullptr, false, AlignOf<largest_scalar_t>()),</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  num_field_loc(0),</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  max_voffset_(0),</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  nested(false),</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  finished(false),</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  minalign_(1),</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  force_defaults_(false),</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  dedup_vtables_(true),</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  string_pool(nullptr) {</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  EndianCheck();</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="comment">// Default construct and swap idiom.</span></div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="comment">// Lack of delegating constructors in vs2010 makes it more verbose than needed.</span></div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  Swap(other);</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  }</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span> <span class="comment"></span></div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span> <span class="comment"> /// @brief Move assignment operator for FlatBufferBuilder.</span></div><div class="line"><a name="l00863"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae65f0619ecb7715ffdae399ebfc56e38"> 863</a></span> <span class="comment"></span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ae65f0619ecb7715ffdae399ebfc56e38">operator=</a>(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &&other) {</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="comment">// Move construct a temporary and swap idiom</span></div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> temp(std::move(other));</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  Swap(temp);</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  }</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span> </div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="keywordtype">void</span> Swap(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &other) {</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <span class="keyword">using</span> std::swap;</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  buf_.swap(other.buf_);</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  swap(num_field_loc, other.num_field_loc);</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  swap(max_voffset_, other.max_voffset_);</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  swap(nested, other.nested);</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  swap(finished, other.finished);</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  swap(minalign_, other.minalign_);</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  swap(force_defaults_, other.force_defaults_);</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  swap(dedup_vtables_, other.dedup_vtables_);</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  swap(string_pool, other.string_pool);</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  }</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span> </div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  ~<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>() {</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  <span class="keywordflow">if</span> (string_pool) <span class="keyword">delete</span> string_pool;</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  }</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span> </div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="keywordtype">void</span> Reset() {</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  Clear(); <span class="comment">// clear builder state</span></div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  buf_.reset(); <span class="comment">// deallocate buffer</span></div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  }</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span> <span class="comment"></span></div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span> <span class="comment"> /// @brief Reset all the state in this FlatBufferBuilder so it can be reused</span></div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span> <span class="comment"> /// to construct another buffer.</span></div><div class="line"><a name="l00894"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412"> 894</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">Clear</a>() {</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  ClearOffsets();</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  buf_.clear();</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  nested = <span class="keyword">false</span>;</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  finished = <span class="keyword">false</span>;</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  minalign_ = 1;</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keywordflow">if</span> (string_pool) string_pool->clear();</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  }</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span> <span class="comment"></span></div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span> <span class="comment"> /// @brief The current size of the serialized buffer, counting from the end.</span></div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> <span class="comment"> /// @return Returns an `uoffset_t` with the current size of the buffer.</span></div><div class="line"><a name="l00905"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f"> 905</a></span> <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="l00906"></a><span class="lineno"> 906</span> <span class="comment"></span></div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span> <span class="comment"> /// @brief Get the serialized buffer (after you call `Finish()`).</span></div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span> <span class="comment"> /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the</span></div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span> <span class="comment"> /// buffer.</span></div><div class="line"><a name="l00910"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83"> 910</a></span> <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="l00911"></a><span class="lineno"> 911</span>  Finished();</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="keywordflow">return</span> buf_.data();</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  }</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span> <span class="comment"></span></div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span> <span class="comment"> /// @brief Get a pointer to an unfinished buffer.</span></div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> <span class="comment"> /// @return Returns a `uint8_t` pointer to the unfinished buffer.</span></div><div class="line"><a name="l00917"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41"> 917</a></span> <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="l00918"></a><span class="lineno"> 918</span> <span class="comment"></span></div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span> <span class="comment"> /// @brief Get the released pointer to the serialized buffer.</span></div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span> <span class="comment"> /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards!</span></div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span> <span class="comment"> /// @return A `FlatBuffer` that owns the buffer and its allocator and</span></div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span> <span class="comment"> /// behaves similar to a `unique_ptr` with a deleter.</span></div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span> <span class="comment"> /// Deprecated: use Release() instead</span></div><div class="line"><a name="l00924"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8"> 924</a></span> <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="l00925"></a><span class="lineno"> 925</span>  Finished();</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  }</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span> <span class="comment"></span></div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span> <span class="comment"> /// @brief Get the released DetachedBuffer.</span></div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span> <span class="comment"> /// @return A `DetachedBuffer` that owns the buffer and its allocator.</span></div><div class="line"><a name="l00931"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45"> 931</a></span> <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="l00932"></a><span class="lineno"> 932</span>  Finished();</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  }</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span> <span class="comment"></span></div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span> <span class="comment"> /// @brief Get the released pointer to the serialized buffer.</span></div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span> <span class="comment"> /// @param The size of the memory block containing</span></div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span> <span class="comment"> /// the serialized `FlatBuffer`.</span></div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span> <span class="comment"> /// @param The offset from the released pointer where the finished</span></div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span> <span class="comment"> /// `FlatBuffer` starts.</span></div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span> <span class="comment"> /// @return A raw pointer to the start of the memory block containing</span></div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span> <span class="comment"> /// the serialized `FlatBuffer`.</span></div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span> <span class="comment"> /// @remark If the allocator is owned, it gets deleted during this call.</span></div><div class="line"><a name="l00944"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416"> 944</a></span> <span class="comment"></span> uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416">ReleaseRaw</a>(<span class="keywordtype">size_t</span> &size, <span class="keywordtype">size_t</span> &offset) {</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  Finished();</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">return</span> buf_.release_raw(size, offset);</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  }</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span> <span class="comment"></span></div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span> <span class="comment"> /// @brief get the minimum alignment this buffer needs to be accessed</span></div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span> <span class="comment"> /// properly. This is only known once all elements have been written (after</span></div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span> <span class="comment"> /// you call Finish()). You can use this information if you need to embed</span></div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span> <span class="comment"> /// a FlatBuffer in some other buffer, such that you can later read it</span></div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span> <span class="comment"> /// without first having to copy it into its own buffer.</span></div><div class="line"><a name="l00954"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b"> 954</a></span> <span class="comment"></span> <span class="keywordtype">size_t</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">GetBufferMinAlignment</a>() {</div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  Finished();</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  <span class="keywordflow">return</span> minalign_;</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  }</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span> <span class="comment"></span></div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span> <span class="comment"></span> <span class="keywordtype">void</span> Finished()<span class="keyword"> const </span>{</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="comment">// If you get this assert, you're attempting to get access a buffer</span></div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="comment">// which hasn't been finished yet. Be sure to call</span></div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  <span class="comment">// FlatBufferBuilder::Finish with your root table.</span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <span class="comment">// If you really need to access an unfinished buffer, call</span></div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="comment">// GetCurrentBufferPointer instead.</span></div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  FLATBUFFERS_ASSERT(finished);</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  }<span class="comment"></span></div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span> <span class="comment"> /// @brief In order to save space, fields that are set to their default value</span></div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span> <span class="comment"> /// don't get serialized into the buffer.</span></div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="comment"> /// @param[in] bool fd When set to `true`, always serializes default values that are set.</span></div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span> <span class="comment"> /// Optional fields which are not set explicitly, will still not be serialized.</span></div><div class="line"><a name="l00974"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a"> 974</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">ForceDefaults</a>(<span class="keywordtype">bool</span> fd) { force_defaults_ = fd; }</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="comment"></span></div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> <span class="comment"> /// @brief By default vtables are deduped in order to save space.</span></div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span> <span class="comment"> /// @param[in] bool dedup When set to `true`, dedup vtables.</span></div><div class="line"><a name="l00978"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961"> 978</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">DedupVtables</a>(<span class="keywordtype">bool</span> dedup) { dedup_vtables_ = dedup; }</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span> <span class="comment"></span></div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span> <span class="comment"></span> <span class="keywordtype">void</span> Pad(<span class="keywordtype">size_t</span> num_bytes) { buf_.fill(num_bytes); }</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span> </div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  <span class="keywordtype">void</span> TrackMinAlign(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  <span class="keywordflow">if</span> (elem_size > minalign_) minalign_ = elem_size;</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  }</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span> </div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="keywordtype">void</span> Align(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  TrackMinAlign(elem_size);</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  buf_.fill(PaddingBytes(buf_.size(), elem_size));</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  }</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span> </div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  <span class="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="l00993"></a><span class="lineno"> 993</span>  PushBytes(bytes, size);</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  finished = <span class="keyword">true</span>;</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  }</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span> </div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <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="l00998"></a><span class="lineno"> 998</span> </div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  <span class="keywordtype">void</span> PopBytes(<span class="keywordtype">size_t</span> amount) { buf_.pop(amount); }</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span> </div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AssertScalarT() {</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <span class="comment">// The code assumes power of 2 sizes and endian-swap-ability.</span></div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  static_assert(flatbuffers::is_scalar<T>::value, <span class="stringliteral">"T must be a scalar type"</span>);</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  }</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> </div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  <span class="comment">// Write a single aligned scalar to the buffer</span></div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(T element) {</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  AssertScalarT<T>();</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  T litle_endian_element = EndianScalar(element);</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  Align(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  buf_.push_small(litle_endian_element);</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  }</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span> </div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> off) {</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="comment">// Special case for offsets: see ReferTo below.</span></div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="keywordflow">return</span> PushElement(ReferTo(off.o));</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  }</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span> </div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  <span class="comment">// When writing fields, we track where they are, so we can create correct</span></div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  <span class="comment">// vtables later.</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  <span class="keywordtype">void</span> TrackField(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  <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="l01024"></a><span class="lineno"> 1024</span>  buf_.scratch_push_small(fl);</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  num_field_loc++;</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  max_voffset_ = (std::max)(max_voffset_, field);</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  }</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span> </div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  <span class="comment">// Like PushElement, but additionally tracks the field this represents.</span></div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddElement(voffset_t field, T e, T def) {</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  <span class="comment">// We don't serialize values equal to the default.</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <span class="keywordflow">if</span> (e == def && !force_defaults_) <span class="keywordflow">return</span>;</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  <span class="keyword">auto</span> off = PushElement(e);</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  TrackField(field, off);</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  }</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> </div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddOffset(voffset_t field, <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> off) {</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  <span class="keywordflow">if</span> (off.IsNull()) <span class="keywordflow">return</span>; <span class="comment">// Don't store.</span></div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  AddElement(field, ReferTo(off.o), static_cast<uoffset_t>(0));</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  }</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> </div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddStruct(voffset_t field, <span class="keyword">const</span> T *structptr) {</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  <span class="keywordflow">if</span> (!structptr) <span class="keywordflow">return</span>; <span class="comment">// Default, don't store.</span></div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  Align(AlignOf<T>());</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  buf_.push_small(*structptr);</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  TrackField(field, GetSize());</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  }</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> </div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="keywordtype">void</span> AddStructOffset(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  TrackField(field, off);</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  }</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> </div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <span class="comment">// Offsets initially are relative to the end of the buffer (downwards).</span></div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  <span class="comment">// This function converts them to be relative to the current location</span></div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="comment">// in the buffer (when stored here), pointing upwards.</span></div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  uoffset_t ReferTo(uoffset_t off) {</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  <span class="comment">// Align to ensure GetSize() below is correct.</span></div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  Align(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <span class="comment">// Offset must refer to something already in buffer.</span></div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  FLATBUFFERS_ASSERT(off && off <= GetSize());</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="keywordflow">return</span> GetSize() - off + <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  }</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span> </div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <span class="keywordtype">void</span> NotNested() {</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="comment">// If you hit this, you're trying to construct a Table/Vector/String</span></div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  <span class="comment">// during the construction of its parent table (between the MyTableBuilder</span></div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  <span class="comment">// and table.Finish().</span></div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  <span class="comment">// Move the creation of these sub-objects to above the MyTableBuilder to</span></div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  <span class="comment">// not get this assert.</span></div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  <span class="comment">// Ignoring this assert may appear to work in simple cases, but the reason</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  <span class="comment">// it is here is that storing objects in-line may cause vtable offsets</span></div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="comment">// to not fit anymore. It also leads to vtable duplication.</span></div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  FLATBUFFERS_ASSERT(!nested);</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <span class="comment">// If you hit this, fields were added outside the scope of a table.</span></div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  FLATBUFFERS_ASSERT(!num_field_loc);</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  }</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span> </div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  <span class="comment">// From generated code (or from the parser), we call StartTable/EndTable</span></div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="comment">// with a sequence of AddElement calls in between.</span></div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  uoffset_t StartTable() {</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  NotNested();</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  nested = <span class="keyword">true</span>;</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  }</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span> </div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  <span class="comment">// This finishes one serialized object by generating the vtable if it's a</span></div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <span class="comment">// table, comparing it against existing vtables, and writing the</span></div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  <span class="comment">// resulting vtable offset.</span></div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  uoffset_t EndTable(uoffset_t start) {</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  <span class="comment">// If you get this assert, a corresponding StartTable wasn't called.</span></div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  FLATBUFFERS_ASSERT(nested);</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <span class="comment">// Write the vtable offset, which is the start of any Table.</span></div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  <span class="comment">// We fill it's value later.</span></div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  <span class="keyword">auto</span> vtableoffsetloc = PushElement<soffset_t>(0);</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  <span class="comment">// Write a vtable, which consists entirely of voffset_t elements.</span></div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  <span class="comment">// It starts with the number of offsets, followed by a type id, followed</span></div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  <span class="comment">// by the offsets themselves. In reverse:</span></div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  <span class="comment">// Include space for the last offset and ensure empty tables have a</span></div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="comment">// minimum size.</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  max_voffset_ =</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  (std::max)(static_cast<voffset_t>(max_voffset_ + <span class="keyword">sizeof</span>(voffset_t)),</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  FieldIndexToOffset(0));</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  buf_.fill_big(max_voffset_);</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  <span class="keyword">auto</span> table_object_size = vtableoffsetloc - start;</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  <span class="comment">// Vtable use 16bit offsets.</span></div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  FLATBUFFERS_ASSERT(table_object_size < 0x10000);</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  WriteScalar<voffset_t>(buf_.data() + <span class="keyword">sizeof</span>(voffset_t),</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  static_cast<voffset_t>(table_object_size));</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  WriteScalar<voffset_t>(buf_.data(), max_voffset_);</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="comment">// Write the offsets into the table</span></div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <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="l01112"></a><span class="lineno"> 1112</span>  it < 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="l01113"></a><span class="lineno"> 1113</span>  <span class="keyword">auto</span> field_location = <span class="keyword">reinterpret_cast<</span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> *<span class="keyword">></span>(it);</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  <span class="keyword">auto</span> pos = <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>(vtableoffsetloc - field_location->off);</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  <span class="comment">// If this asserts, it means you've set a field twice.</span></div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  FLATBUFFERS_ASSERT(</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  !ReadScalar<voffset_t>(buf_.data() + field_location->id));</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  WriteScalar<voffset_t>(buf_.data() + field_location->id, pos);</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  }</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  ClearOffsets();</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  <span class="keyword">auto</span> vt1 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data());</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  <span class="keyword">auto</span> vt1_size = ReadScalar<voffset_t>(vt1);</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  <span class="keyword">auto</span> vt_use = GetSize();</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  <span class="comment">// See if we already have generated a vtable with this exact same</span></div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <span class="comment">// layout before. If so, make it point to the old one, remove this one.</span></div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="keywordflow">if</span> (dedup_vtables_) {</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = buf_.scratch_data(); it < buf_.scratch_end();</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  it += <span class="keyword">sizeof</span>(uoffset_t)) {</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  <span class="keyword">auto</span> vt_offset_ptr = <span class="keyword">reinterpret_cast<</span>uoffset_t *<span class="keyword">></span>(it);</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  <span class="keyword">auto</span> vt2 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data_at(*vt_offset_ptr));</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="keyword">auto</span> vt2_size = *vt2;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  <span class="keywordflow">if</span> (vt1_size != vt2_size || memcmp(vt2, vt1, vt1_size)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  vt_use = *vt_offset_ptr;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  buf_.pop(GetSize() - vtableoffsetloc);</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  }</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  }</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <span class="comment">// If this is a new vtable, remember it.</span></div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="keywordflow">if</span> (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); }</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  <span class="comment">// Fill the vtable offset we created above.</span></div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  <span class="comment">// The offset points from the beginning of the object to where the</span></div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <span class="comment">// vtable is stored.</span></div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  <span class="comment">// Offsets default direction is downward in memory for future format</span></div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  <span class="comment">// flexibility (storing all vtables at the start of the file).</span></div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  WriteScalar(buf_.data_at(vtableoffsetloc),</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="keyword">static_cast<</span>soffset_t<span class="keyword">></span>(vt_use) -</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  static_cast<soffset_t>(vtableoffsetloc));</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  nested = <span class="keyword">false</span>;</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  <span class="keywordflow">return</span> vtableoffsetloc;</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  }</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> </div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  <span class="comment">// DEPRECATED: call the version above instead.</span></div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  uoffset_t EndTable(uoffset_t start, voffset_t <span class="comment">/*numfields*/</span>) {</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <span class="keywordflow">return</span> EndTable(start);</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  }</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> </div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  <span class="comment">// This checks a required field has been set in a given table that has</span></div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  <span class="comment">// just been constructed.</span></div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> Required(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> table, voffset_t field);</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span> </div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  uoffset_t StartStruct(<span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  Align(alignment);</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  }</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> </div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  uoffset_t EndStruct() { <span class="keywordflow">return</span> GetSize(); }</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> </div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="keywordtype">void</span> ClearOffsets() {</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  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="l01171"></a><span class="lineno"> 1171</span>  num_field_loc = 0;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  max_voffset_ = 0;</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  }</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span> </div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="comment">// Aligns such that when "len" bytes are written, an object can be written</span></div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  <span class="comment">// after it with "alignment" without padding.</span></div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  TrackMinAlign(alignment);</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  buf_.fill(PaddingBytes(GetSize() + len, alignment));</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  }</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  AssertScalarT<T>();</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  PreAlign(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  }<span class="comment"></span></div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01191"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe"> 1191</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01192"></a><span class="lineno"> 1192</span>  NotNested();</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  PreAlign<uoffset_t>(len + 1); <span class="comment">// Always 0-terminated.</span></div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  buf_.fill(1);</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  PushBytes(reinterpret_cast<const uint8_t *>(str), len);</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  PushElement(static_cast<uoffset_t>(len));</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a>(GetSize());</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  }</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> <span class="comment"></span></div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span> <span class="comment"> /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01203"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5"> 1203</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01204"></a><span class="lineno"> 1204</span>  <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  }</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span> <span class="comment"></span></div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span> <span class="comment"> /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span> <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="l01209"></a><span class="lineno"> 1209</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01210"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154"> 1210</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01211"></a><span class="lineno"> 1211</span>  <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  }</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span> <span class="comment"></span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01217"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f"> 1217</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a>(<span class="keyword">const</span> std::string &str) {</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  }</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> </div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span> <span class="preprocessor"> #ifdef FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> <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="l01225"></a><span class="lineno"> 1225</span> <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="l01226"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6"> 1226</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01227"></a><span class="lineno"> 1227</span>  <span class="keywordflow">return</span> CreateString(str.data(), str.size());</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  }</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span> <span class="preprocessor"> #endif // FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span> <span class="comment"></span></div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01235"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506"> 1235</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01236"></a><span class="lineno"> 1236</span>  <span class="keywordflow">return</span> str ? CreateString(str->c_str(), str->Length()) : 0;</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  }</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> <span class="comment"></span></div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> <span class="comment"> /// @param[in] str A const reference to a std::string like type with support</span></div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> <span class="comment"> /// of T::c_str() and T::length() to store in the buffer.</span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01243"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685"> 1243</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685">CreateString</a>(<span class="keyword">const</span> T &str) {</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  }</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> <span class="comment"></span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01253"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1"> 1253</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01254"></a><span class="lineno"> 1254</span>  <span class="keywordflow">if</span> (!string_pool)</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  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="l01256"></a><span class="lineno"> 1256</span>  <span class="keyword">auto</span> size_before_string = buf_.size();</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="comment">// Must first serialize the string, since the set is all offsets into</span></div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="comment">// buffer.</span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  <span class="keyword">auto</span> off = CreateString(str, len);</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <span class="keyword">auto</span> it = string_pool->find(off);</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  <span class="comment">// If it exists we reuse existing serialized data!</span></div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <span class="keywordflow">if</span> (it != string_pool->end()) {</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  <span class="comment">// We can remove the string we serialized.</span></div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  buf_.pop(buf_.size() - size_before_string);</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <span class="keywordflow">return</span> *it;</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  }</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  <span class="comment">// Record this string for future use.</span></div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  string_pool->insert(off);</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  <span class="keywordflow">return</span> off;</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  }</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span> <span class="comment"></span></div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> <span class="comment"> /// @brief Store a string in the buffer, which null-terminated.</span></div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01277"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7"> 1277</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01278"></a><span class="lineno"> 1278</span>  <span class="keywordflow">return</span> CreateSharedString(str, strlen(str));</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  }</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> <span class="comment"></span></div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01286"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9"> 1286</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">CreateSharedString</a>(<span class="keyword">const</span> std::string &str) {</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  <span class="keywordflow">return</span> CreateSharedString(str.c_str(), str.length());</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  }</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> <span class="comment"></span></div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01295"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3"> 1295</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></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="l01296"></a><span class="lineno"> 1296</span>  <span class="keywordflow">return</span> CreateSharedString(str->c_str(), str->Length());</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  }</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> <span class="comment"></span></div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span> <span class="comment"></span> uoffset_t EndVector(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  FLATBUFFERS_ASSERT(nested); <span class="comment">// Hit if no corresponding StartVector.</span></div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  nested = <span class="keyword">false</span>;</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  <span class="keywordflow">return</span> PushElement(static_cast<uoffset_t>(len));</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  }</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span> </div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <span class="keywordtype">void</span> StartVector(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize) {</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  NotNested();</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  nested = <span class="keyword">true</span>;</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  PreAlign<uoffset_t>(len * elemsize);</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  PreAlign(len * elemsize, elemsize); <span class="comment">// Just in case elemsize > uoffset_t.</span></div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  }</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span> </div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <span class="comment">// Call this right before StartVector/CreateVector if you want to force the</span></div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  <span class="comment">// alignment to be something different than what the element size would</span></div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  <span class="comment">// normally dictate.</span></div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <span class="comment">// This is useful when storing a nested_flatbuffer in a vector of bytes,</span></div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  <span class="comment">// or when storing SIMD floats, etc.</span></div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  <span class="keywordtype">void</span> ForceVectorAlignment(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize, <span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  PreAlign(len * elemsize, alignment);</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  }</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span> </div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  <span class="comment">// Similar to ForceVectorAlignment but for String fields.</span></div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keywordtype">void</span> ForceStringAlignment(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  PreAlign((len + 1) * <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), alignment);</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  }</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span> <span class="comment"></span></div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span> <span class="comment"> /// @brief Serialize an array into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> <span class="comment"> /// @tparam T The data type of the array elements.</span></div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01336"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3"> 1336</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01337"></a><span class="lineno"> 1337</span>  <span class="comment">// If this assert hits, you're specifying a template argument that is</span></div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  <span class="comment">// causing the wrong overload to be selected, remove it.</span></div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  AssertScalarT<T>();</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  StartVector(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span> <span class="preprocessor"> #if FLATBUFFERS_LITTLEENDIAN</span></div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), len * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(T) == 1) {</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), len);</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i > 0; ) {</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  PushElement(v[--i]);</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  }</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  }</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>>(EndVector(len));</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  }</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span> </div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>> CreateVector(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  StartVector(len, <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a>));</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i > 0;) { PushElement(v[--i]); }</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>>(EndVector(len));</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  }</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> <span class="comment"></span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> <span class="comment"> /// @brief Serialize a `std::vector` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01370"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207"> 1370</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(<span class="keyword">const</span> std::vector<T> &v) {</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <span class="keywordflow">return</span> CreateVector(data(v), v.size());</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  }</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span> </div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="comment">// vector<bool> may be implemented using a bit-set, so we can't access it as</span></div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="comment">// an array. Instead, read elements manually.</span></div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <span class="comment">// Background: https://isocpp.org/blog/2012/11/on-vectorbool</span></div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<uint8_t></a>> CreateVector(<span class="keyword">const</span> std::vector<bool> &v) {</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  StartVector(v.size(), <span class="keyword">sizeof</span>(uint8_t));</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = v.size(); i > 0;) {</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  PushElement(static_cast<uint8_t>(v[--i]));</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  }</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<uint8_t></a>>(EndVector(v.size()));</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  }</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span> </div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> <span class="comment"> /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> <span class="comment"></span><span class="comment"> /// This is a convenience function that takes care of iteration for you.</span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span> <span class="comment"></span><span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> <span class="comment"></span><span class="comment"> /// @param f A function that takes the current iteration 0..vector_size-1 and</span></div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span> <span class="comment"></span><span class="comment"> /// returns any type that you can construct a FlatBuffers vector out of.</span></div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span> <span class="comment"></span><span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span> <span class="comment"></span><span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01394"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b"> 1394</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01395"></a><span class="lineno"> 1395</span>  <span class="keyword">const</span> std::function<T (<span class="keywordtype">size_t</span> i)> &f) {</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  std::vector<T> elems(vector_size);</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) elems[i] = f(i);</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  }</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> <span class="comment"></span></div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span> <span class="comment"> /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> <span class="comment"> /// This is a convenience function that takes care of iteration for you.</span></div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span> <span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> <span class="comment"> /// @param f A function that takes the current iteration 0..vector_size-1,</span></div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> <span class="comment"> /// and the state parameter returning any type that you can construct a</span></div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span> <span class="comment"> /// FlatBuffers vector out of.</span></div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span> <span class="comment"> /// @param state State passed to f.</span></div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S></div><div class="line"><a name="l01413"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a"> 1413</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01414"></a><span class="lineno"> 1414</span>  std::vector<T> elems(vector_size);</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) elems[i] = f(i, state);</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  }</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> <span class="comment"></span></div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span> <span class="comment"> /// @brief Serialize a `std::vector<std::string>` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span> <span class="comment"> /// This is a convenience function for a common case.</span></div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01425"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6"> 1425</a></span> <span class="comment"></span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<String></a>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="keyword">const</span> std::vector<std::string> &v) {</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  std::vector<Offset<String>> offsets(v.size());</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < v.size(); i++) offsets[i] = CreateString(v[i]);</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  <span class="keywordflow">return</span> CreateVector(offsets);</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  }</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span> <span class="comment"></span></div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01440"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7"> 1440</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01441"></a><span class="lineno"> 1441</span>  StartVector(len * <span class="keyword">sizeof</span>(T) / AlignOf<T>(), AlignOf<T>());</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), <span class="keyword">sizeof</span>(T) * len);</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>>(EndVector(len));</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  }</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> <span class="comment"></span></div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> <span class="comment"> /// @brief Serialize an array of native structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span> <span class="comment"> /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span> <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="l01450"></a><span class="lineno"> 1450</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01455"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53"> 1455</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  std::vector<T> vv(len);</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  std::transform(v, v + len, vv.begin(), *(Pack_t)&Pack);</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  <span class="keywordflow">return</span> CreateVectorOfStructs<T>(vv.data(), vv.size());</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  }</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span> </div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> <span class="comment"></span><span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span> <span class="comment"></span><span class="comment"> /// @param[in] f A function that takes the current iteration 0..vector_size-1</span></div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span> <span class="comment"></span><span class="comment"> /// and a pointer to the struct that must be filled.</span></div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span> <span class="comment"></span><span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span> <span class="comment"></span><span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span> <span class="comment"></span><span class="comment"> /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span> <span class="comment"></span><span class="comment"> /// accessors.</span></div><div class="line"><a name="l01474"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72"> 1474</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  <span class="keywordtype">size_t</span> vector_size, <span class="keyword">const</span> std::function<<span class="keywordtype">void</span>(<span class="keywordtype">size_t</span> i, T *)> &filler) {</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  T* structs = StartVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) {</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  filler(i, structs);</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  structs++;</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  }</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  <span class="keywordflow">return</span> EndVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  }</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span> <span class="comment"></span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</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="l01489"></a><span class="lineno"> 1489</span> <span class="comment"> /// a pointer to the struct that must be filled and the state argument.</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span> <span class="comment"> /// @param[in] state Arbitrary state to pass to f.</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span> <span class="comment"> /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span> <span class="comment"> /// accessors.</span></div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S></div><div class="line"><a name="l01496"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5"> 1496</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01497"></a><span class="lineno"> 1497</span>  S *state) {</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  T *structs = StartVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) {</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  f(i, structs, state);</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  structs++;</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  }</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  <span class="keywordflow">return</span> EndVectorOfStructs<T>(vector_size);</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  }</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span> <span class="comment"></span></div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span> <span class="comment"> /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc></div><div class="line"><a name="l01513"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42"> 1513</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="keyword">const</span> std::vector<T, Alloc> &v) {</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  <span class="keywordflow">return</span> CreateVectorOfStructs(data(v), v.size());</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  }</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> <span class="comment"></span></div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> <span class="comment"> /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span> <span class="comment"> /// `vector`.</span></div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> <span class="comment"> /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01527"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95"> 1527</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">CreateVectorOfNativeStructs</a>(</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="keyword">const</span> std::vector<S> &v) {</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <span class="keywordflow">return</span> CreateVectorOfNativeStructs<T, S>(data(v), v.size());</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  }</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> <span class="comment"></span></div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>StructKeyComparator {</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> T &a, <span class="keyword">const</span> T &b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>  <span class="keywordflow">return</span> a.KeyCompareLessThan(&b);</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  }</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> </div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  StructKeyComparator &operator=(<span class="keyword">const</span> StructKeyComparator &);</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  };<span class="comment"></span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span> <span class="comment"> /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`</span></div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span> <span class="comment"> /// in sorted order.</span></div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01551"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15"> 1551</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">CreateVectorOfSortedStructs</a>(std::vector<T> *v) {</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  <span class="keywordflow">return</span> CreateVectorOfSortedStructs(data(*v), v->size());</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  }</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span> <span class="comment"></span></div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> <span class="comment"> /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> <span class="comment"> /// `vector` in sorted order.</span></div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> <span class="comment"> /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01564"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54"> 1564</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">CreateVectorOfSortedNativeStructs</a>(</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  std::vector<S> *v) {</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  <span class="keywordflow">return</span> CreateVectorOfSortedNativeStructs<T, S>(data(*v), v->size());</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  }</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span> <span class="comment"></span></div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted</span></div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span> <span class="comment"> /// order.</span></div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01578"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf"> 1578</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <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="l01579"></a><span class="lineno"> 1579</span>  std::sort(v, v + len, StructKeyComparator<T>());</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  <span class="keywordflow">return</span> CreateVectorOfStructs(v, len);</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  }</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span> <span class="comment"></span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span> <span class="comment"> /// @brief Serialize an array of native structs into a FlatBuffer `vector` in</span></div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span> <span class="comment"> /// sorted order.</span></div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span> <span class="comment"> /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span> <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="l01588"></a><span class="lineno"> 1588</span> <span class="comment"> /// buffer as a `vector`.</span></div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> S></div><div class="line"><a name="l01593"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf"> 1593</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">CreateVectorOfSortedNativeStructs</a>(S *v,</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &);</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  std::vector<T> vv(len);</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  std::transform(v, v + len, vv.begin(), *(Pack_t)&Pack);</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  <span class="keywordflow">return</span> CreateVectorOfSortedStructs<T>(vv, len);</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  }</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span> <span class="comment"></span></div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>TableKeyComparator {</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  TableKeyComparator(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &buf) : buf_(buf) {}</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> &a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> &b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="keyword">auto</span> table_a = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(a.o));</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <span class="keyword">auto</span> table_b = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(b.o));</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  <span class="keywordflow">return</span> table_a->KeyCompareLessThan(table_b);</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  }</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &buf_;</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span> </div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  TableKeyComparator &operator=(<span class="keyword">const</span> TableKeyComparator &);</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  };<span class="comment"></span></div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span> <span class="comment"> /// @endcond</span></div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span> <span class="comment"> /// in sorted order.</span></div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01626"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6"> 1626</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> *v,</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  std::sort(v, v + len, TableKeyComparator<T>(buf_));</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  <span class="keywordflow">return</span> CreateVector(v, len);</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  }</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span> <span class="comment"></span></div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> <span class="comment"> /// in sorted order.</span></div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span> <span class="comment"> /// where the vector is stored.</span></div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01640"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135"> 1640</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<Offset<T></a>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  std::vector<<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a>> *v) {</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  <span class="keywordflow">return</span> CreateVectorOfSortedTables(data(*v), v->size());</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>  }</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span> <span class="comment"></span></div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span> <span class="comment"> /// @param[in] elemsize The size of each element in the `vector`.</span></div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span> <span class="comment"> /// @param[out] buf A pointer to a `uint8_t` pointer that can be</span></div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span> <span class="comment"> /// in the buffer.</span></div><div class="line"><a name="l01652"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c"> 1652</a></span> <span class="comment"></span> uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize,</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  uint8_t **buf) {</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  NotNested();</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  StartVector(len, elemsize);</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  buf_.make_space(len * elemsize);</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  <span class="keyword">auto</span> vec_start = GetSize();</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  <span class="keyword">auto</span> vec_end = EndVector(len);</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  *buf = buf_.data_at(vec_start);</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <span class="keywordflow">return</span> vec_end;</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  }</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span> <span class="comment"></span></div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span> <span class="comment"> /// @tparam T The data type of the data that will be stored in the buffer</span></div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span> <span class="comment"> /// as a `vector`.</span></div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span> <span class="comment"> /// @param[out] buf A pointer to a pointer of type `T` that can be</span></div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span> <span class="comment"> /// in the buffer.</span></div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01672"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50"> 1672</a></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<T></a>> <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="l01673"></a><span class="lineno"> 1673</span>  AssertScalarT<T>();</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  <span class="keywordflow">return</span> CreateUninitializedVector(len, <span class="keyword">sizeof</span>(T),</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  reinterpret_cast<uint8_t **>(buf));</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  }</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span> </div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T*></a>> CreateUninitializedVectorOfStructs(<span class="keywordtype">size_t</span> len, T **buf) {</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  <span class="keywordflow">return</span> CreateUninitializedVector(len, <span class="keyword">sizeof</span>(T),</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  reinterpret_cast<uint8_t **>(buf));</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  }</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span> <span class="comment"></span></div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span> <span class="comment"> /// @brief Write a struct by itself, typically to be part of a union.</span></div><div class="line"><a name="l01685"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8"> 1685</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<const T *></a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8">CreateStruct</a>(<span class="keyword">const</span> T &structobj) {</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>  NotNested();</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>  Align(AlignOf<T>());</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>  buf_.push_small(structobj);</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<const T *></a>(GetSize());</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  }</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> <span class="comment"></span></div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span> <span class="comment"> /// @brief The length of a FlatBuffer file header.</span></div><div class="line"><a name="l01693"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19"> 1693</a></span> <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="l01694"></a><span class="lineno"> 1694</span> <span class="comment"></span></div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span> <span class="comment"> /// @brief Finish serializing a buffer by writing the root offset.</span></div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span> <span class="comment"> /// @param[in] file_identifier If a `file_identifier` is given, the buffer</span></div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span> <span class="comment"> /// will be prefixed with a standard FlatBuffers file header.</span></div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01699"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912"> 1699</a></span>  <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<T></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="l01700"></a><span class="lineno"> 1700</span>  Finish(root.o, file_identifier, <span class="keyword">false</span>);</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  }</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span> <span class="comment"></span></div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span> <span class="comment"> /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the</span></div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span> <span class="comment"> /// buffer following the size field). These buffers are NOT compatible</span></div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span> <span class="comment"> /// with standard buffers created by Finish, i.e. you can't call GetRoot</span></div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span> <span class="comment"> /// on them, you have to use GetSizePrefixedRoot instead.</span></div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span> <span class="comment"> /// All >32 bit quantities in this buffer will be aligned when the whole</span></div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span> <span class="comment"> /// size pre-fixed buffer is aligned.</span></div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span> <span class="comment"> /// These kinds of buffers are useful for creating a stream of FlatBuffers.</span></div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01711"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220"> 1711</a></span>  <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<T></a> root,</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  Finish(root.o, file_identifier, <span class="keyword">true</span>);</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  }</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span> </div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  <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> &);</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &operator=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &);</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span> </div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  <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="l01722"></a><span class="lineno"> 1722</span>  NotNested();</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  buf_.clear_scratch();</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  <span class="comment">// This will cause the whole buffer to be aligned.</span></div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  PreAlign((size_prefix ? <span class="keyword">sizeof</span>(uoffset_t) : 0) + <span class="keyword">sizeof</span>(uoffset_t) +</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>  (file_identifier ? kFileIdentifierLength : 0),</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  minalign_);</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  <span class="keywordflow">if</span> (file_identifier) {</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength);</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  PushBytes(reinterpret_cast<const uint8_t *>(file_identifier),</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  kFileIdentifierLength);</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>  }</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>  PushElement(ReferTo(root)); <span class="comment">// Location of root.</span></div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>  <span class="keywordflow">if</span> (size_prefix) { PushElement(GetSize()); }</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  finished = <span class="keyword">true</span>;</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  }</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span> </div><div class="line"><a name="l01738"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html"> 1738</a></span>  <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="l01739"></a><span class="lineno"> 1739</span>  uoffset_t off;</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  voffset_t id;</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>  };</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span> </div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> buf_;</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span> </div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  <span class="comment">// Accumulating offsets of table members while it is being built.</span></div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  <span class="comment">// We store these in the scratch pad of buf_, after the vtable offsets.</span></div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  uoffset_t num_field_loc;</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  <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="l01749"></a><span class="lineno"> 1749</span>  <span class="comment">// possible vtable.</span></div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>  voffset_t max_voffset_;</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> </div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  <span class="comment">// Ensure objects are not nested.</span></div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>  <span class="keywordtype">bool</span> nested;</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span> </div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  <span class="comment">// Ensure the buffer is finished before it is being accessed.</span></div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  <span class="keywordtype">bool</span> finished;</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span> </div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  <span class="keywordtype">size_t</span> minalign_;</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span> </div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  <span class="keywordtype">bool</span> force_defaults_; <span class="comment">// Serialize values equal to their defaults anyway.</span></div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span> </div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  <span class="keywordtype">bool</span> dedup_vtables_;</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span> </div><div class="line"><a name="l01764"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html"> 1764</a></span>  <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="l01765"></a><span class="lineno"> 1765</span>  <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> &buf) : buf_(&buf) {}</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> &a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a> &b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  <span class="keyword">auto</span> stra = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">></span>(buf_->data_at(a.o));</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  <span class="keyword">auto</span> strb = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">></span>(buf_->data_at(b.o));</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  <span class="keywordflow">return</span> strncmp(stra->c_str(), strb->c_str(),</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  (std::min)(stra->size(), strb->size()) + 1) < 0;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  }</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> *buf_;</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  };</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span> </div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  <span class="comment">// For use with CreateSharedString. Instantiated on first use only.</span></div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  <span class="keyword">typedef</span> std::set<Offset<String>, <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>> StringOffsetMap;</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  StringOffsetMap *string_pool;</div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span> </div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  <span class="comment">// Allocates space for a vector of structures.</span></div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  <span class="comment">// Must be completed with EndVectorOfStructs().</span></div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T *StartVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  StartVector(vector_size * <span class="keyword">sizeof</span>(T) / AlignOf<T>(), AlignOf<T>());</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.make_space(vector_size * <span class="keyword">sizeof</span>(T)));</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  }</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span> </div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="comment">// End the vector of structues in the flatbuffers.</span></div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  <span class="comment">// Vector should have previously be started with StartVectorOfStructs().</span></div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>> EndVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset<Vector<const T *></a>>(EndVector(vector_size));</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  }</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> };<span class="comment"></span></div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span> <span class="comment">/// @}</span></div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span> <span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span> <span class="comment"></span><span class="comment">// Helpers to get a typed pointer to the root object contained in the buffer.</span></div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> T *GetMutableRoot(<span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  EndianCheck();</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(buf) +</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  EndianScalar(*reinterpret_cast<uoffset_t *>(buf)));</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span> }</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span> </div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <span class="keywordflow">return</span> GetMutableRoot<T>(<span class="keyword">const_cast<</span><span class="keywordtype">void</span> *<span class="keyword">></span>(buf));</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span> }</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span> </div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetSizePrefixedRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  <span class="keywordflow">return</span> GetRoot<T>(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(buf) + <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span> }</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span> <span class="comment"></span></div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span> <span class="comment">/// Helpers to get a typed pointer to objects that are currently being built.</span></div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span> <span class="comment">/// @warning Creating new objects will lead to reallocations and invalidates</span></div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span> <span class="comment">/// the pointer!</span></div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span> <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span> T *GetMutableTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> offset) {</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></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="l01819"></a><span class="lineno"> 1819</span>  offset.o);</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span> }</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span> </div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span> <span class="keyword">const</span> T *GetTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> offset) {</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  <span class="keywordflow">return</span> GetMutableTemporaryPointer<T>(fbb, offset);</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> }</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span> <span class="comment"></span></div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span> <span class="comment">/// @brief Get a pointer to the the file_identifier section of the buffer.</span></div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span> <span class="comment">/// @return Returns a const char pointer to the start of the file_identifier</span></div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span> <span class="comment">/// characters in the buffer. The returned char * has length</span></div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span> <span class="comment">/// 'flatbuffers::FlatBufferBuilder::kFileIdentifierLength'.</span></div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span> <span class="comment">/// This function is UNDEFINED for FlatBuffers whose schema does not include</span></div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span> <span class="comment">/// a file_identifier (likely points at padding or the start of a the root</span></div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span> <span class="comment">/// vtable).</span></div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span> <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="l01835"></a><span class="lineno"> 1835</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">></span>(buf) +</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  ((size_prefixed) ? 2 * <span class="keyword">sizeof</span>(uoffset_t) : <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span> }</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span> </div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span> <span class="comment">// Helper to see if the identifier in a buffer has the expected value.</span></div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> BufferHasIdentifier(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keyword">const</span> <span class="keywordtype">char</span> *identifier, <span class="keywordtype">bool</span> size_prefixed = <span class="keyword">false</span>) {</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  <span class="keywordflow">return</span> strncmp(GetBufferIdentifier(buf, size_prefixed), identifier,</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a>) == 0;</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span> }</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span> </div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span> <span class="comment">// Helper class to verify the integrity of a FlatBuffer</span></div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span> <span class="keyword">class </span>Verifier FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  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="l01849"></a><span class="lineno"> 1849</span>  uoffset_t _max_tables = 1000000)</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  : buf_(buf),</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  size_(buf_len),</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  depth_(0),</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  max_depth_(_max_depth),</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  num_tables_(0),</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  max_tables_(_max_tables)</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  , upper_bound_(0)</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  <span class="preprocessor">#endif</span></div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  {</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  assert(size_ < FLATBUFFERS_MAX_BUFFER_SIZE);</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  }</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span> </div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  <span class="comment">// Central location where any verification failures register.</span></div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  <span class="keywordtype">bool</span> Check(<span class="keywordtype">bool</span> ok)<span class="keyword"> const </span>{</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span> <span class="preprocessor"> #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE</span></div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  FLATBUFFERS_ASSERT(ok);</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  <span class="keywordflow">if</span> (!ok)</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  upper_bound_ = 0;</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  <span class="keywordflow">return</span> ok;</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  }</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span> </div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  <span class="comment">// Verify any range within the buffer.</span></div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  <span class="keywordtype">bool</span> Verify(<span class="keywordtype">size_t</span> elem, <span class="keywordtype">size_t</span> elem_len)<span class="keyword"> const </span>{</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  <span class="keyword">auto</span> upper_bound = elem + elem_len;</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  <span class="keywordflow">if</span> (upper_bound_ < upper_bound)</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  upper_bound_ = upper_bound;</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="keywordflow">return</span> Check(elem_len < size_ && elem <= size_ - elem_len);</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  }</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span> </div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyAlignment(<span class="keywordtype">size_t</span> elem)<span class="keyword"> const </span>{</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  <span class="keywordflow">return</span> (elem & (<span class="keyword">sizeof</span>(T) - 1)) == 0;</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  }</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span> </div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  <span class="comment">// Verify a range indicated by sizeof(T).</span></div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keywordtype">size_t</span> elem)<span class="keyword"> const </span>{</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <span class="keywordflow">return</span> VerifyAlignment<T>(elem) && Verify(elem, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  }</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span> </div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  <span class="comment">// Verify relative to a known-good base pointer.</span></div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> uint8_t *base, voffset_t elem_off, <span class="keywordtype">size_t</span> elem_len)<span class="keyword"> const </span>{</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  <span class="keywordflow">return</span> Verify(static_cast<size_t>(base - buf_) + elem_off, elem_len);</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  }</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span> </div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> uint8_t *base, voffset_t elem_off)<span class="keyword"></span></div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span> <span class="keyword"> const </span>{</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <span class="keywordflow">return</span> Verify(static_cast<size_t>(base - buf_) + elem_off, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  }</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span> </div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  <span class="comment">// Verify a pointer (may be NULL) of a table type.</span></div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyTable(<span class="keyword">const</span> T *table) {</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  <span class="keywordflow">return</span> !table || table->Verify(*<span class="keyword">this</span>);</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  }</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span> </div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  <span class="comment">// Verify a pointer (may be NULL) of any vector type.</span></div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVector(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<T></a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  <span class="keywordflow">return</span> !vec || VerifyVectorOrString(reinterpret_cast<const uint8_t *>(vec),</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  }</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span> </div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="comment">// Verify a pointer (may be NULL) of a vector to struct.</span></div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVector(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector<const T *></a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  <span class="keywordflow">return</span> VerifyVector(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector<T></a> *<span class="keyword">></span>(vec));</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  }</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span> </div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  <span class="comment">// Verify a pointer (may be NULL) to string.</span></div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  <span class="keywordtype">bool</span> VerifyString(<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="l01928"></a><span class="lineno"> 1928</span>  <span class="keywordtype">size_t</span> end;</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  <span class="keywordflow">return</span> !str ||</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  (VerifyVectorOrString(reinterpret_cast<const uint8_t *>(str),</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  1, &end) &&</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  Verify(end, 1) && <span class="comment">// Must have terminator</span></div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  Check(buf_[end] == <span class="charliteral">'\0'</span>)); <span class="comment">// Terminating byte must be 0.</span></div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  }</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span> </div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  <span class="comment">// Common code between vectors and strings.</span></div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  <span class="keywordtype">bool</span> VerifyVectorOrString(<span class="keyword">const</span> uint8_t *vec, <span class="keywordtype">size_t</span> elem_size,</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <span class="keywordtype">size_t</span> *end = <span class="keyword">nullptr</span>)<span class="keyword"> const </span>{</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  <span class="keyword">auto</span> veco = <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(vec - buf_);</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  <span class="comment">// Check we can read the size field.</span></div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  <span class="keywordflow">if</span> (!Verify<uoffset_t>(veco)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  <span class="comment">// Check the whole array. If this is a string, the byte past the array</span></div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="comment">// must be 0.</span></div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  <span class="keyword">auto</span> size = ReadScalar<uoffset_t>(vec);</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  <span class="keyword">auto</span> max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  <span class="keywordflow">if</span> (!Check(size < max_elems))</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Protect against byte_size overflowing.</span></div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  <span class="keyword">auto</span> byte_size = <span class="keyword">sizeof</span>(size) + elem_size * size;</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  <span class="keywordflow">if</span> (end) *end = veco + byte_size;</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  <span class="keywordflow">return</span> Verify(veco, byte_size);</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  }</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span> </div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="comment">// Special case for string contents, after the above has been called.</span></div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  <span class="keywordtype">bool</span> VerifyVectorOfStrings(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<String></a>> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  <span class="keywordflow">if</span> (!VerifyString(vec->Get(i))) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>  }</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>  }</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  }</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span> </div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="comment">// Special case for table contents, after the above has been called.</span></div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVectorOfTables(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a><<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a>> *vec) {</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  <span class="keywordflow">if</span> (!vec->Get(i)->Verify(*<span class="keyword">this</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  }</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  }</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  }</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span> </div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  <span class="keywordtype">bool</span> VerifyTableStart(<span class="keyword">const</span> uint8_t *table) {</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>  <span class="comment">// Check the vtable offset.</span></div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  <span class="keyword">auto</span> tableo = <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(table - buf_);</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  <span class="keywordflow">if</span> (!Verify<soffset_t>(tableo)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  <span class="comment">// This offset may be signed, but doing the substraction unsigned always</span></div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  <span class="comment">// gives the result we want.</span></div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  <span class="keyword">auto</span> vtableo = tableo - <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(ReadScalar<soffset_t>(table));</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  <span class="comment">// Check the vtable size field, then check vtable fits in its entirety.</span></div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  <span class="keywordflow">return</span> VerifyComplexity() && Verify<voffset_t>(vtableo) &&</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  VerifyAlignment<voffset_t>(ReadScalar<voffset_t>(buf_ + vtableo)) &&</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  Verify(vtableo, ReadScalar<voffset_t>(buf_ + vtableo));</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  }</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span> </div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  <span class="keywordtype">bool</span> VerifyBufferFromStart(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier, <span class="keywordtype">size_t</span> start) {</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  <span class="keywordflow">if</span> (identifier &&</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  (size_ < 2 * <span class="keyword">sizeof</span>(flatbuffers::uoffset_t) ||</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  !BufferHasIdentifier(buf_ + start, identifier))) {</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  }</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span> </div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  <span class="comment">// Call T::Verify, which must be in the generated code for this type.</span></div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  <span class="keyword">auto</span> o = VerifyOffset(start);</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  <span class="keywordflow">return</span> o && <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>T *<span class="keyword">></span>(buf_ + start + o)->Verify(*<span class="keyword">this</span>)</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>  <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  && GetComputedSize()</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  <span class="preprocessor">#endif</span></div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  ;</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  }</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span> </div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <span class="comment">// Verify this whole buffer, starting with root type T.</span></div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBuffer() { <span class="keywordflow">return</span> VerifyBuffer<T>(<span class="keyword">nullptr</span>); }</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span> </div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <span class="keywordflow">return</span> VerifyBufferFromStart<T>(identifier, 0);</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  }</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span> </div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifySizePrefixedBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <span class="keywordflow">return</span> Verify<uoffset_t>(0U) &&</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  ReadScalar<uoffset_t>(buf_) == size_ - <span class="keyword">sizeof</span>(uoffset_t) &&</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  VerifyBufferFromStart<T>(identifier, <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  }</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span> </div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  uoffset_t VerifyOffset(<span class="keywordtype">size_t</span> start)<span class="keyword"> const </span>{</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  <span class="keywordflow">if</span> (!Verify<uoffset_t>(start)) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  <span class="keyword">auto</span> o = ReadScalar<uoffset_t>(buf_ + start);</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="comment">// May not point to itself.</span></div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  Check(o != 0);</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  <span class="comment">// Can't wrap around / buffers are max 2GB.</span></div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  <span class="keywordflow">if</span> (!Check(static_cast<soffset_t>(o) >= 0)) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  <span class="comment">// Must be inside the buffer to create a pointer from it (pointer outside</span></div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <span class="comment">// buffer is UB).</span></div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  <span class="keywordflow">if</span> (!Verify(start + o, 1)) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  <span class="keywordflow">return</span> o;</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  }</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span> </div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  uoffset_t VerifyOffset(<span class="keyword">const</span> uint8_t *base, voffset_t start)<span class="keyword"> const </span>{</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <span class="keywordflow">return</span> VerifyOffset(static_cast<size_t>(base - buf_) + start);</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  }</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span> </div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  <span class="comment">// Called at the start of a table to increase counters measuring data</span></div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  <span class="comment">// structure depth and amount, and possibly bails out with false if</span></div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <span class="comment">// limits set by the constructor have been hit. Needs to be balanced</span></div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  <span class="comment">// with EndTable().</span></div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  <span class="keywordtype">bool</span> VerifyComplexity() {</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  depth_++;</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  num_tables_++;</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <span class="keywordflow">return</span> Check(depth_ <= max_depth_ && num_tables_ <= max_tables_);</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  }</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span> </div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  <span class="comment">// Called at the end of a table to pop the depth count.</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  <span class="keywordtype">bool</span> EndTable() {</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  depth_--;</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  }</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span> </div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  <span class="comment">// Returns the message size in bytes</span></div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keywordtype">size_t</span> GetComputedSize()<span class="keyword"> const </span>{</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  uintptr_t size = upper_bound_;</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  <span class="comment">// Align the size to uoffset_t</span></div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  size = (size - 1 + <span class="keyword">sizeof</span>(uoffset_t)) & ~(<span class="keyword">sizeof</span>(uoffset_t) - 1);</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  <span class="keywordflow">return</span> (size > size_) ? 0 : size;</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  }</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span> </div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  <span class="keyword">const</span> uint8_t *buf_;</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  <span class="keywordtype">size_t</span> size_;</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  uoffset_t depth_;</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  uoffset_t max_depth_;</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  uoffset_t num_tables_;</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  uoffset_t max_tables_;</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  <span class="comment">// clang-format off</span></div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  <span class="keyword">mutable</span> <span class="keywordtype">size_t</span> upper_bound_;</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  <span class="comment">// clang-format on</span></div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span> };</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span> </div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span> <span class="comment">// Convenient way to bundle a buffer and its length, to pass it around</span></div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span> <span class="comment">// typed by its root.</span></div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span> <span class="comment">// A BufferRef does not own its buffer.</span></div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span> <span class="keyword">struct </span>BufferRefBase {}; <span class="comment">// for std::is_base_of</span></div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>BufferRef : BufferRefBase {</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  BufferRef() : buf(<span class="keyword">nullptr</span>), len(0), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  BufferRef(uint8_t *_buf, uoffset_t _len)</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  : buf(_buf), len(_len), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span> </div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  ~BufferRef() {</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  <span class="keywordflow">if</span> (must_free) free(buf);</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  }</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span> </div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  <span class="keyword">const</span> T *GetRoot()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(buf); }</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span> </div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  <span class="keywordtype">bool</span> Verify() {</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  Verifier verifier(buf, len);</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  <span class="keywordflow">return</span> verifier.VerifyBuffer<T>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  }</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span> </div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  uint8_t *buf;</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  uoffset_t len;</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  <span class="keywordtype">bool</span> must_free;</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> };</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span> </div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span> <span class="comment">// "structs" are flat structures that do not have an offset table, thus</span></div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span> <span class="comment">// always have all members present and do not support forwards/backwards</span></div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span> <span class="comment">// compatible extensions.</span></div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span> </div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span> <span class="keyword">class </span>Struct FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  <span class="keywordflow">return</span> ReadScalar<T>(&data_[o]);</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  }</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span> </div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetStruct(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T<span class="keyword">></span>(&data_[o]);</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  }</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span> </div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(uoffset_t o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &data_[o]; }</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  uint8_t *GetAddressOf(uoffset_t o) { <span class="keywordflow">return</span> &data_[o]; }</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> </div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  uint8_t data_[1];</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span> };</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span> </div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span> <span class="comment">// "tables" use an offset table (possibly shared) that allows fields to be</span></div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span> <span class="comment">// omitted and added at will, but uses an extra indirection to read.</span></div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span> <span class="keyword">class </span>Table {</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  <span class="keyword">const</span> uint8_t *GetVTable()<span class="keyword"> const </span>{</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  <span class="keywordflow">return</span> data_ - ReadScalar<soffset_t>(data_);</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  }</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span> </div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  <span class="comment">// This gets the field offset for any of the functions below it, or 0</span></div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  <span class="comment">// if the field was not present.</span></div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  voffset_t GetOptionalFieldOffset(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  <span class="comment">// The vtable offset is always at the start.</span></div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  <span class="keyword">auto</span> vtable = GetVTable();</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  <span class="comment">// The first element is the size of the vtable (fields + type id + itself).</span></div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  <span class="keyword">auto</span> vtsize = ReadScalar<voffset_t>(vtable);</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>  <span class="comment">// If the field we're accessing is outside the vtable, we're reading older</span></div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>  <span class="comment">// data, so it's the same as if the offset was 0 (not present).</span></div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  <span class="keywordflow">return</span> field < vtsize ? ReadScalar<voffset_t>(vtable + field) : 0;</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  }</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span> </div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(voffset_t field, T defaultval)<span class="keyword"> const </span>{</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  <span class="keywordflow">return</span> field_offset ? ReadScalar<T>(data_ + field_offset) : defaultval;</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  }</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span> </div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field) {</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  <span class="keyword">auto</span> p = data_ + field_offset;</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p + ReadScalar<uoffset_t>(p))</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  }</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetPointer<P>(field);</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>  }</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span> </div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetStruct(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <span class="keyword">auto</span> p = <span class="keyword">const_cast<</span>uint8_t *<span class="keyword">></span>(data_ + field_offset);</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p) : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  }</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span> </div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> SetField(voffset_t field, T val, T def) {</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> val == def;</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>  WriteScalar(data_ + field_offset, val);</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>  }</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span> </div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keywordtype">bool</span> SetPointer(voffset_t field, <span class="keyword">const</span> uint8_t *val) {</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  WriteScalar(data_ + field_offset,</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  static_cast<uoffset_t>(val - (data_ + field_offset)));</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  }</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span> </div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  uint8_t *GetAddressOf(voffset_t field) {</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  <span class="keywordflow">return</span> field_offset ? data_ + field_offset : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  }</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetAddressOf(field);</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  }</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span> </div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  <span class="keywordtype">bool</span> CheckField(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  <span class="keywordflow">return</span> GetOptionalFieldOffset(field) != 0;</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  }</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span> </div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  <span class="comment">// Verify the vtable of this table.</span></div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>  <span class="comment">// Call this once per table, followed by VerifyField once per field.</span></div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  <span class="keywordtype">bool</span> VerifyTableStart(Verifier &verifier)<span class="keyword"> const </span>{</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  <span class="keywordflow">return</span> verifier.VerifyTableStart(data_);</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  }</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span> </div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="comment">// Verify a particular field.</span></div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="keywordtype">bool</span> VerifyField(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  <span class="comment">// Calling GetOptionalFieldOffset should be safe now thanks to</span></div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>  <span class="comment">// VerifyTable().</span></div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  <span class="comment">// Check the actual field.</span></div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  <span class="keywordflow">return</span> !field_offset || verifier.Verify<T>(data_, field_offset);</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  }</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span> </div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="comment">// VerifyField for required fields.</span></div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  <span class="keywordtype">bool</span> VerifyFieldRequired(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &&</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  verifier.Verify<T>(data_, field_offset);</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  }</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span> </div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="comment">// Versions for offsets.</span></div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="keywordtype">bool</span> VerifyOffset(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>  <span class="keywordflow">return</span> !field_offset || verifier.VerifyOffset(data_, field_offset);</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>  }</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span> </div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <span class="keywordtype">bool</span> VerifyOffsetRequired(<span class="keyword">const</span> Verifier &verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &&</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  verifier.VerifyOffset(data_, field_offset);</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  }</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span> </div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  <span class="comment">// private constructor & copy constructor: you obtain instances of this</span></div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <span class="comment">// class by pointing to existing data only</span></div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  Table();</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>  Table(<span class="keyword">const</span> Table &other);</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span> </div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  uint8_t data_[1];</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span> };</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span> </div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> FlatBufferBuilder::Required(<a class="code" href="structflatbuffers_1_1_offset.html">Offset<T></a> table,</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  voffset_t field) {</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  <span class="keyword">auto</span> table_ptr = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(buf_.data_at(table.o));</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  <span class="keywordtype">bool</span> ok = table_ptr->GetOptionalFieldOffset(field) != 0;</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  <span class="comment">// If this fails, the caller will show what field needs to be set.</span></div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>  FLATBUFFERS_ASSERT(ok);</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>  (void)ok;</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span> }</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span> <span class="comment"></span></div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span> <span class="comment">/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e.</span></div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span> <span class="comment">/// it is the opposite transformation of GetRoot().</span></div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span> <span class="comment">/// This may be useful if you want to pass on a root and have the recipient</span></div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span> <span class="comment">/// delete the buffer afterwards.</span></div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span> <span class="comment"></span><span class="keyword">inline</span> <span class="keyword">const</span> uint8_t *GetBufferStartFromRootPointer(<span class="keyword">const</span> <span class="keywordtype">void</span> *root) {</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  <span class="keyword">auto</span> table = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(root);</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  <span class="keyword">auto</span> vtable = table->GetVTable();</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  <span class="comment">// Either the vtable is before the root or after the root.</span></div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <span class="keyword">auto</span> start = (std::min)(vtable, reinterpret_cast<const uint8_t *>(root));</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  <span class="comment">// Align to at least sizeof(uoffset_t).</span></div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  start = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(<span class="keyword">reinterpret_cast<</span>uintptr_t<span class="keyword">></span>(start) &</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  ~(<span class="keyword">sizeof</span>(uoffset_t) - 1));</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  <span class="comment">// Additionally, there may be a file_identifier in the buffer, and the root</span></div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  <span class="comment">// offset. The buffer may have been aligned to any size between</span></div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  <span class="comment">// sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align").</span></div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  <span class="comment">// Sadly, the exact alignment is only known when constructing the buffer,</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  <span class="comment">// since it depends on the presence of values with said alignment properties.</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  <span class="comment">// So instead, we simply look at the next uoffset_t values (root,</span></div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="comment">// file_identifier, and alignment padding) to see which points to the root.</span></div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  <span class="comment">// None of the other values can "impersonate" the root since they will either</span></div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  <span class="comment">// be 0 or four ASCII characters.</span></div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  static_assert(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a> == <span class="keyword">sizeof</span>(uoffset_t),</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  <span class="stringliteral">"file_identifier is assumed to be the same size as uoffset_t"</span>);</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> possible_roots = FLATBUFFERS_MAX_ALIGNMENT / <span class="keyword">sizeof</span>(uoffset_t) + 1;</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  possible_roots; possible_roots--) {</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  start -= <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  <span class="keywordflow">if</span> (ReadScalar<uoffset_t>(start) + start ==</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>  <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(root))</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <span class="keywordflow">return</span> start;</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  }</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  <span class="comment">// We didn't find the root, either the "root" passed isn't really a root,</span></div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  <span class="comment">// or the buffer is corrupt.</span></div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  <span class="comment">// Assert, because calling this function with bad data may cause reads</span></div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  <span class="comment">// outside of buffer boundaries.</span></div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  FLATBUFFERS_ASSERT(<span class="keyword">false</span>);</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span> }</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span> <span class="comment"></span></div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span> <span class="comment">/// @brief This return the prefixed size of a FlatBuffer.</span></div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span> <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<uoffset_t>(buf); }</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span> </div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span> <span class="comment">// Base class for native objects (FlatBuffer data de-serialized into native</span></div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span> <span class="comment">// C++ data structures).</span></div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span> <span class="comment">// Contains no functionality, purely documentative.</span></div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span> <span class="keyword">struct </span>NativeTable {};</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span> <span class="comment"></span></div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span> <span class="comment">/// @brief Function types to be used with resolving hashes into objects and</span></div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span> <span class="comment">/// back again. The resolver gets a pointer to a field inside an object API</span></div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span> <span class="comment">/// object that is of the type specified in the schema using the attribute</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span> <span class="comment">/// `cpp_type` (it is thus important whatever you write to this address</span></div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span> <span class="comment">/// matches that type). The value of this field is initially null, so you</span></div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span> <span class="comment">/// may choose to implement a delayed binding lookup using this function</span></div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span> <span class="comment">/// if you wish. The resolver does the opposite lookup, for when the object</span></div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span> <span class="comment">/// is being serialized again.</span></div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span> <span class="comment"></span><span class="keyword">typedef</span> uint64_t hash_value_t;</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span> <span class="preprocessor">#ifdef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  <span class="keyword">typedef</span> void (*resolver_function_t)(<span class="keywordtype">void</span> **pointer_adr, hash_value_t hash);</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <span class="keyword">typedef</span> hash_value_t (*rehasher_function_t)(<span class="keywordtype">void</span> *pointer);</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  <span class="keyword">typedef</span> std::function<void (void **pointer_adr, hash_value_t hash)></div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  resolver_function_t;</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>  <span class="keyword">typedef</span> std::function<hash_value_t (void *pointer)> rehasher_function_t;</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span> </div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span> <span class="comment">// Helper function to test if a field is present, using any of the field</span></div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span> <span class="comment">// enums in the generated code.</span></div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span> <span class="comment">// `table` must be a generated table type. Since this is a template parameter,</span></div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span> <span class="comment">// this is not typechecked to be a subclass of Table, so beware!</span></div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span> <span class="comment">// Note: this function will return false for fields equal to the default</span></div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span> <span class="comment">// value, since they're not stored in the buffer (unless force_defaults was</span></div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span> <span class="comment">// used).</span></div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> IsFieldPresent(<span class="keyword">const</span> T *table, voffset_t field) {</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  <span class="comment">// Cast, since Table is a private baseclass of any table types.</span></div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(table)->CheckField(field);</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span> }</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span> </div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span> <span class="comment">// Utility function for reverse lookups on the EnumNames*() functions</span></div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span> <span class="comment">// (in the generated C++ code)</span></div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span> <span class="comment">// names must be NULL terminated.</span></div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> LookupEnum(<span class="keyword">const</span> <span class="keywordtype">char</span> **names, <span class="keyword">const</span> <span class="keywordtype">char</span> *name) {</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> **p = names; *p; p++)</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  <span class="keywordflow">if</span> (!strcmp(*p, name)) <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(p - names);</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span> }</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span> </div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span> <span class="comment">// These macros allow us to layout a struct with a guarantee that they'll end</span></div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span> <span class="comment">// up looking the same on different compilers and platforms.</span></div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span> <span class="comment">// It does this by disallowing the compiler to do any padding, and then</span></div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span> <span class="comment">// does padding itself by inserting extra padding fields that make every</span></div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span> <span class="comment">// element aligned to its own size.</span></div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span> <span class="comment">// Additionally, it manually sets the alignment of the struct as a whole,</span></div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span> <span class="comment">// which is typically its largest element, or a custom size set in the schema</span></div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span> <span class="comment">// by the force_align attribute.</span></div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span> <span class="comment">// These are used in the generated code only.</span></div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span> </div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span> <span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span> <span class="preprocessor"> #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span> <span class="preprocessor"> __pragma(pack(1)); \</span></div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span> <span class="preprocessor"> struct __declspec(align(alignment))</span></div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span> <span class="preprocessor"> #define FLATBUFFERS_STRUCT_END(name, size) \</span></div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span> <span class="preprocessor"> __pragma(pack()); \</span></div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span> <span class="preprocessor">#elif defined(__GNUC__) || defined(__clang__)</span></div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span> <span class="preprocessor"> #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span> <span class="preprocessor"> _Pragma("pack(1)") \</span></div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span> <span class="preprocessor"> struct __attribute__((aligned(alignment)))</span></div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span> <span class="preprocessor"> #define FLATBUFFERS_STRUCT_END(name, size) \</span></div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span> <span class="preprocessor"> _Pragma("pack()") \</span></div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span> <span class="preprocessor"> #error Unknown compiler, please define structure alignment macros</span></div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span> </div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span> <span class="comment">// Minimal reflection via code generation.</span></div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span> <span class="comment">// Besides full-fat reflection (see reflection.h) and parsing/printing by</span></div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span> <span class="comment">// loading schemas (see idl.h), we can also have code generation for mimimal</span></div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span> <span class="comment">// reflection data which allows pretty-printing and other uses without needing</span></div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span> <span class="comment">// a schema or a parser.</span></div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> <span class="comment">// Generate code with --reflect-types (types only) or --reflect-names (names</span></div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span> <span class="comment">// also) to enable.</span></div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span> <span class="comment">// See minireflect.h for utilities using this functionality.</span></div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span> </div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span> <span class="comment">// These types are organized slightly differently as the ones in idl.h.</span></div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span> <span class="keyword">enum</span> SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM };</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span> </div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span> <span class="comment">// Scalars have the same order as in idl.h</span></div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span> <span class="preprocessor">#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \</span></div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span> <span class="preprocessor"> ET(ET_UTYPE) \</span></div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span> <span class="preprocessor"> ET(ET_BOOL) \</span></div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span> <span class="preprocessor"> ET(ET_CHAR) \</span></div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span> <span class="preprocessor"> ET(ET_UCHAR) \</span></div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span> <span class="preprocessor"> ET(ET_SHORT) \</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span> <span class="preprocessor"> ET(ET_USHORT) \</span></div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span> <span class="preprocessor"> ET(ET_INT) \</span></div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span> <span class="preprocessor"> ET(ET_UINT) \</span></div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span> <span class="preprocessor"> ET(ET_LONG) \</span></div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> <span class="preprocessor"> ET(ET_ULONG) \</span></div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span> <span class="preprocessor"> ET(ET_FLOAT) \</span></div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span> <span class="preprocessor"> ET(ET_DOUBLE) \</span></div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> <span class="preprocessor"> ET(ET_STRING) \</span></div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span> <span class="preprocessor"> ET(ET_SEQUENCE) // See SequenceType.</span></div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span> </div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span> <span class="keyword">enum</span> ElementaryType {</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span> <span class="preprocessor"> #define FLATBUFFERS_ET(E) E,</span></div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span> };</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span> </div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span> <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="l02399"></a><span class="lineno"> 2399</span>  <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="l02400"></a><span class="lineno"> 2400</span> <span class="preprocessor"> #define FLATBUFFERS_ET(E) #E,</span></div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>  <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  };</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  <span class="keywordflow">return</span> names;</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span> }</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span> </div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span> <span class="comment">// Basic type info cost just 16bits per field!</span></div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span> <span class="keyword">struct </span>TypeCode {</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  uint16_t base_type : 4; <span class="comment">// ElementaryType</span></div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  uint16_t is_vector : 1;</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  int16_t sequence_ref : 11; <span class="comment">// Index into type_refs below, or -1 for none.</span></div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span> };</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span> </div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span> static_assert(<span class="keyword">sizeof</span>(TypeCode) == 2, <span class="stringliteral">"TypeCode"</span>);</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span> </div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span> <span class="keyword">struct </span>TypeTable;</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span> </div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span> <span class="comment">// Signature of the static method present in each type.</span></div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span> <span class="keyword">typedef</span> <span class="keyword">const</span> TypeTable *(*TypeFunction)();</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span> </div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span> <span class="keyword">struct </span>TypeTable {</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  SequenceType st;</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  <span class="keywordtype">size_t</span> num_elems; <span class="comment">// of type_codes, values, names (but not type_refs).</span></div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  <span class="keyword">const</span> TypeCode *type_codes; <span class="comment">// num_elems count</span></div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  <span class="keyword">const</span> TypeFunction *type_refs; <span class="comment">// less than num_elems entries (see TypeCode).</span></div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  <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="l02428"></a><span class="lineno"> 2428</span>  <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="l02429"></a><span class="lineno"> 2429</span> };</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span> </div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span> <span class="comment">// String which identifies the current version of FlatBuffers.</span></div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span> <span class="comment">// flatbuffer_version_string is used by Google developers to identify which</span></div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span> <span class="comment">// applications uploaded to Google Play are using this library. This allows</span></div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span> <span class="comment">// the development team at Google to determine the popularity of the library.</span></div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span> <span class="comment">// How it works: Applications that are uploaded to the Google Play Store are</span></div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span> <span class="comment">// scanned for this version string. We track which applications are using it</span></div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span> <span class="comment">// to measure popularity. You are free to remove it (of course) but we would</span></div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span> <span class="comment">// appreciate if you left it in.</span></div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> </div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> <span class="comment">// Weak linkage is culled by VS & doesn't work on cygwin.</span></div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span> <span class="comment">// clang-format off</span></div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span> <span class="preprocessor">#if !defined(_WIN32) && !defined(__CYGWIN__)</span></div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span> </div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span> <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="l02445"></a><span class="lineno"> 2445</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="l02446"></a><span class="lineno"> 2446</span>  <span class="stringliteral">"FlatBuffers "</span></div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) <span class="stringliteral">"."</span></div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) <span class="stringliteral">"."</span></div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span> </div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span> <span class="preprocessor">#endif // !defined(_WIN32) && !defined(__CYGWIN__)</span></div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span> </div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span> <span class="preprocessor">#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\</span></div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span> <span class="preprocessor"> inline E operator | (E lhs, E rhs){\</span></div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span> <span class="preprocessor"> return E(T(lhs) | T(rhs));\</span></div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span> <span class="preprocessor"> inline E operator & (E lhs, E rhs){\</span></div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span> <span class="preprocessor"> return E(T(lhs) & T(rhs));\</span></div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span> <span class="preprocessor"> inline E operator ^ (E lhs, E rhs){\</span></div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span> <span class="preprocessor"> return E(T(lhs) ^ T(rhs));\</span></div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span> <span class="preprocessor"> inline E operator ~ (E lhs){\</span></div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span> <span class="preprocessor"> return E(~T(lhs));\</span></div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span> <span class="preprocessor"> inline E operator |= (E &lhs, E rhs){\</span></div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span> <span class="preprocessor"> lhs = lhs | rhs;\</span></div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span> <span class="preprocessor"> return lhs;\</span></div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span> <span class="preprocessor"> inline E operator &= (E &lhs, E rhs){\</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span> <span class="preprocessor"> lhs = lhs & rhs;\</span></div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span> <span class="preprocessor"> return lhs;\</span></div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span> <span class="preprocessor"> inline E operator ^= (E &lhs, E rhs){\</span></div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span> <span class="preprocessor"> lhs = lhs ^ rhs;\</span></div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span> <span class="preprocessor"> return lhs;\</span></div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span> <span class="preprocessor"> inline bool operator !(E rhs) \</span></div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span> <span class="preprocessor"> {\</span></div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span> <span class="preprocessor"> return !bool(T(rhs)); \</span></div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span> <span class="preprocessor"> }</span></div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span> <span class="comment">/// @endcond</span></div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span> <span class="comment"></span>} <span class="comment">// namespace flatbuffers</span></div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span> </div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span> <span class="comment">// clang-format on</span></div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span> </div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span> <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< Vector< T > > CreateVector(size_t vector_size, const std::function< T(size_t i)> &f)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1394</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:1652</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a6e90ada59d9553636f72ce8e4a892f72"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(size_t vector_size, const std::function< void(size_t i, T *)> &filler)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1474</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< Vector< const T * > > 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:1578</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< Vector< const T * > > CreateVectorOfSortedNativeStructs(std::vector< S > *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:1564</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:905</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac64d11c219559ea51567eab556e13135"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(std::vector< Offset< T >> *v)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1640</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:811</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ae65f0619ecb7715ffdae399ebfc56e38"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ae65f0619ecb7715ffdae399ebfc56e38">flatbuffers::FlatBufferBuilder::operator=</a></div><div class="ttdeci">FlatBufferBuilder & operator=(FlatBufferBuilder &&other)</div><div class="ttdoc">Move assignment operator for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:859</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< String > 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:1206</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:890</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< Vector< const T * > > 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:1492</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< Vector< const T * > > 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:1451</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< const T * > CreateStruct(const T &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:1681</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:815</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ae65f0619ecb7715ffdae399ebfc56e38"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ae65f0619ecb7715ffdae399ebfc56e38">flatbuffers::FlatBufferBuilder::operator=</a></div><div class="ttdeci">FlatBufferBuilder & operator=(FlatBufferBuilder &&other)</div><div class="ttdoc">Move assignment operator for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:863</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< String > 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:1210</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:894</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< Vector< const T * > > 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:1496</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< Vector< const T * > > 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:1455</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< const T * > CreateStruct(const T &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:1685</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< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish a buffer with a 32 bit size field pre-fixed (size of the buffer following the size field)...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1707</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a7ba8462e408431054c99d25120326220"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">flatbuffers::FlatBufferBuilder::FinishSizePrefixed</a></div><div class="ttdeci">void FinishSizePrefixed(Offset< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish a buffer with a 32 bit size field pre-fixed (size of the buffer following the size field)...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1711</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:453</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3eb68613e5883dc4b8fff6cf7d1223d7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1273</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3eb68613e5883dc4b8fff6cf7d1223d7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1277</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="classflatbuffers_1_1_flat_buffer_builder_html_a86e1a348b7474fd5d239016ae97afc56"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a86e1a348b7474fd5d239016ae97afc56">flatbuffers::FlatBufferBuilder::FlatBufferBuilder</a></div><div class="ttdeci">FlatBufferBuilder(FlatBufferBuilder &&other)</div><div class="ttdoc">Move constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:842</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a86e1a348b7474fd5d239016ae97afc56"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a86e1a348b7474fd5d239016ae97afc56">flatbuffers::FlatBufferBuilder::FlatBufferBuilder</a></div><div class="ttdeci">FlatBufferBuilder(FlatBufferBuilder &&other)</div><div class="ttdoc">Move constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:846</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< String > CreateString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1187</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&#39;t get serialized into the buff...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:970</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:906</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aec6f9df2a0366b540b24822414d92cbe"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1191</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&#39;t get serialized into the buff...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:974</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:910</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:415</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:974</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:1689</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< largest_scalar_t >())</div><div class="ttdoc">Default constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:824</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac0b6a1c5d949f20ad84367fc0f9e1506"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1231</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:978</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:1693</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< largest_scalar_t >())</div><div class="ttdoc">Default constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:828</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac0b6a1c5d949f20ad84367fc0f9e1506"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1235</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:560</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< Vector< const T * > > 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:1589</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a840b769fbb4148f97d3eed266e4690c3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1291</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:913</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< String > CreateString(const T &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:1239</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< Vector< const T * > > CreateVectorOfSortedStructs(std::vector< T > *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:1547</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a592110519a6c8db1926f1365bf2a58e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">flatbuffers::FlatBufferBuilder::CreateVectorOfStrings</a></div><div class="ttdeci">Offset< Vector< Offset< String > > > CreateVectorOfStrings(const std::vector< std::string > &v)</div><div class="ttdoc">Serialize a std::vector<std::string> into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1421</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< Vector< T > > 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:1409</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:950</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< Vector< const T * > > CreateVectorOfStructs(const std::vector< T, Alloc > &v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1509</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_afede51fd9c32d146cbb1832f57c5e1b7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(const T *v, size_t len)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1436</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< Vector< const T * > > CreateVectorOfNativeStructs(const std::vector< S > &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:1523</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aad93d113ac24e86ed04b5236b3f4c0c5"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which is null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1199</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< Vector< const T * > > 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:1593</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a840b769fbb4148f97d3eed266e4690c3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1295</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:917</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< String > CreateString(const T &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:1243</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< Vector< const T * > > CreateVectorOfSortedStructs(std::vector< T > *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:1551</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a592110519a6c8db1926f1365bf2a58e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">flatbuffers::FlatBufferBuilder::CreateVectorOfStrings</a></div><div class="ttdeci">Offset< Vector< Offset< String > > > CreateVectorOfStrings(const std::vector< std::string > &v)</div><div class="ttdoc">Serialize a std::vector<std::string> into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1425</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< Vector< T > > 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:1413</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:954</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< Vector< const T * > > CreateVectorOfStructs(const std::vector< T, Alloc > &v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1513</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_afede51fd9c32d146cbb1832f57c5e1b7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(const T *v, size_t len)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1440</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< Vector< const T * > > CreateVectorOfNativeStructs(const std::vector< S > &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:1527</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aad93d113ac24e86ed04b5236b3f4c0c5"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which is null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1203</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:374</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="classflatbuffers_1_1_flat_buffer_builder_html_aa090a68856f7b554cc7cac3c279fb416"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416">flatbuffers::FlatBufferBuilder::ReleaseRaw</a></div><div class="ttdeci">uint8_t * ReleaseRaw(size_t &size, size_t &offset)</div><div class="ttdoc">Get the released pointer to the serialized buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:940</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:1734</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8c3af55e64f5cda9aefa38ac5287ef9f"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1213</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_af715dd24dd37cb0151dc7a980ad0f207"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const std::vector< T > &v)</div><div class="ttdoc">Serialize a std::vector into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1366</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2305b63d367845972b51669dd995cc50"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">flatbuffers::FlatBufferBuilder::CreateUninitializedVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateUninitializedVector(size_t len, T **buf)</div><div class="ttdoc">Specialized version of CreateVector for non-copying use cases. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1668</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< String > 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:1222</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2cca5c89246a53e80e6ad9487f4c36f3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const T *v, size_t len)</div><div class="ttdoc">Serialize an array into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1332</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a10e8ec7d1c8fbdc21b1c7047bbbe38d9"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1282</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2130ef232ff405eebe2e7f184ecd06e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(Offset< T > *v, size_t len)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1622</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:927</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab478a645216d2d613fc7b7c29b0ff9d1"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1249</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aa090a68856f7b554cc7cac3c279fb416"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416">flatbuffers::FlatBufferBuilder::ReleaseRaw</a></div><div class="ttdeci">uint8_t * ReleaseRaw(size_t &size, size_t &offset)</div><div class="ttdoc">Get the released pointer to the serialized buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:944</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:1738</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8c3af55e64f5cda9aefa38ac5287ef9f"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1217</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_af715dd24dd37cb0151dc7a980ad0f207"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const std::vector< T > &v)</div><div class="ttdoc">Serialize a std::vector into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1370</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2305b63d367845972b51669dd995cc50"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">flatbuffers::FlatBufferBuilder::CreateUninitializedVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateUninitializedVector(size_t len, T **buf)</div><div class="ttdoc">Specialized version of CreateVector for non-copying use cases. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1672</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< String > 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:1226</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2cca5c89246a53e80e6ad9487f4c36f3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const T *v, size_t len)</div><div class="ttdoc">Serialize an array into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1336</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a10e8ec7d1c8fbdc21b1c7047bbbe38d9"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1286</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2130ef232ff405eebe2e7f184ecd06e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(Offset< T > *v, size_t len)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1626</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:931</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab478a645216d2d613fc7b7c29b0ff9d1"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1253</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:920</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a0c9e507b373d598b51052fab4fa34912"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">flatbuffers::FlatBufferBuilder::Finish</a></div><div class="ttdeci">void Finish(Offset< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish serializing a buffer by writing the root offset. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1695</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:1760</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:924</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a0c9e507b373d598b51052fab4fa34912"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">flatbuffers::FlatBufferBuilder::Finish</a></div><div class="ttdeci">void Finish(Offset< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish serializing a buffer by writing the root offset. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1699</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:1764</div></div> </div><!-- fragment --></div><!-- contents --> </div><!-- doc-content --> <!-- Google Analytics --> diff --git a/flatbuffers_guide_using_schema_compiler.html b/flatbuffers_guide_using_schema_compiler.html index 23740839..2e70aa67 100644 --- a/flatbuffers_guide_using_schema_compiler.html +++ b/flatbuffers_guide_using_schema_compiler.html @@ -131,6 +131,7 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_using_schema_compile <li><p class="startli"><code>--gen-mutable</code> : Generate additional non-const accessors for mutating FlatBuffers in-place.</p> <p class="startli"><code>--gen-object-api</code> : Generate an additional object-based API. This API is more convenient for object construction and mutation than the base API, at the cost of efficiency (object allocation). Recommended only to be used if other options are insufficient.</p> </li> +<li><code>--gen-compare</code> : Generate operator== for object-based API types.</li> <li><code>--gen-onefile</code> : Generate single output file (useful for C#)</li> <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> diff --git a/functions.html b/functions.html index 072437c3..0245db24 100644 --- a/functions.html +++ b/functions.html @@ -420,6 +420,9 @@ $(document).ready(function(){initNavTree('functions.html','');}); <li>ReleaseBufferPointer() : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">flatbuffers::FlatBufferBuilder</a> </li> +<li>releaseByteBuffer() +: <a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f">com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory</a> +</li> <li>ReleaseRaw() : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416">flatbuffers::FlatBufferBuilder</a> </li> diff --git a/functions_func.html b/functions_func.html index b9b90e2a..4b680c20 100644 --- a/functions_func.html +++ b/functions_func.html @@ -400,6 +400,9 @@ $(document).ready(function(){initNavTree('functions_func.html','');}); <li>ReleaseBufferPointer() : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">flatbuffers::FlatBufferBuilder</a> </li> +<li>releaseByteBuffer() +: <a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f">com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory</a> +</li> <li>ReleaseRaw() : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416">flatbuffers::FlatBufferBuilder</a> </li> diff --git a/group__flatbuffers__java__api.js b/group__flatbuffers__java__api.js index 049d96f3..d6cccb75 100644 --- a/group__flatbuffers__java__api.js +++ b/group__flatbuffers__java__api.js @@ -6,7 +6,8 @@ var group__flatbuffers__java__api = ] ], [ "FlatBufferBuilder", "classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html", [ [ "ByteBufferFactory", "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html", [ - [ "newByteBuffer", "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a", null ] + [ "newByteBuffer", "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a", null ], + [ "releaseByteBuffer", "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f", null ] ] ], [ "HeapByteBufferFactory", "classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html", [ [ "newByteBuffer", "classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html#aac26ff51a8162b37a072792ec9068644", null ] diff --git a/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory-members.html b/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory-members.html index 7ece4271..62676686 100644 --- a/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory-members.html +++ b/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory-members.html @@ -95,6 +95,7 @@ $(document).ready(function(){initNavTree('interfacecom_1_1google_1_1flatbuffers_ <p>This is the complete list of members for <a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html">com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory</a>, including all inherited members.</p> <table class="directory"> <tr class="even"><td class="entry"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a">newByteBuffer</a>(int capacity)</td><td class="entry"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html">com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory</a></td><td class="entry"></td></tr> + <tr><td class="entry"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f">releaseByteBuffer</a>(ByteBuffer bb)</td><td class="entry"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html">com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> </table></div><!-- contents --> </div><!-- doc-content --> <!-- Google Analytics --> diff --git a/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html b/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html index 57407ea5..408dd5ce 100644 --- a/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html +++ b/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html @@ -116,6 +116,9 @@ Public Member Functions</h2></td></tr> <tr class="memitem:a0db9a9033d232d584443a433d7576f4a"><td class="memItemLeft" align="right" valign="top">ByteBuffer </td><td class="memItemRight" valign="bottom"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a">newByteBuffer</a> (int capacity)</td></tr> <tr class="memdesc:a0db9a9033d232d584443a433d7576f4a"><td class="mdescLeft"> </td><td class="mdescRight">Create a <code>ByteBuffer</code> with a given capacity. <a href="#a0db9a9033d232d584443a433d7576f4a">More...</a><br /></td></tr> <tr class="separator:a0db9a9033d232d584443a433d7576f4a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6cc2f5b5077273da8180b63a5db24b8f"><td class="memItemLeft" align="right" valign="top">default void </td><td class="memItemRight" valign="bottom"><a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f">releaseByteBuffer</a> (ByteBuffer bb)</td></tr> +<tr class="memdesc:a6cc2f5b5077273da8180b63a5db24b8f"><td class="mdescLeft"> </td><td class="mdescRight">Release a ByteBuffer. <a href="#a6cc2f5b5077273da8180b63a5db24b8f">More...</a><br /></td></tr> +<tr class="separator:a6cc2f5b5077273da8180b63a5db24b8f"><td class="memSeparator" colspan="2"> </td></tr> </table> <h2 class="groupheader">Member Function Documentation</h2> <a id="a0db9a9033d232d584443a433d7576f4a"></a> @@ -145,6 +148,41 @@ Public Member Functions</h2></td></tr> <p>Implemented in <a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_heap_byte_buffer_factory.html#aac26ff51a8162b37a072792ec9068644">com.google.flatbuffers.FlatBufferBuilder.HeapByteBufferFactory</a>.</p> +</div> +</div> +<a id="a6cc2f5b5077273da8180b63a5db24b8f"></a> +<h2 class="memtitle"><span class="permalink"><a href="#a6cc2f5b5077273da8180b63a5db24b8f">◆ </a></span>releaseByteBuffer()</h2> + +<div class="memitem"> +<div class="memproto"> +<table class="mlabels"> + <tr> + <td class="mlabels-left"> + <table class="memname"> + <tr> + <td class="memname">default void com.google.flatbuffers.FlatBufferBuilder.ByteBufferFactory.releaseByteBuffer </td> + <td>(</td> + <td class="paramtype">ByteBuffer </td> + <td class="paramname"><em>bb</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>Release a ByteBuffer. </p> +<p>Current <a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> released any reference to it, so it is safe to dispose the buffer or return it to a pool. It is not guaranteed that the buffer has been created with <a class="el" href="interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a">newByteBuffer(int)</a>.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramname">bb</td><td>the buffer to release </td></tr> + </table> + </dd> +</dl> + </div> </div> <hr/>The documentation for this interface was generated from the following file:<ul> diff --git a/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.js b/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.js index 08e13542..33aa344e 100644 --- a/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.js +++ b/interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.js @@ -1,4 +1,5 @@ var interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory = [ - [ "newByteBuffer", "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a", null ] + [ "newByteBuffer", "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a", null ], + [ "releaseByteBuffer", "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f", null ] ]; \ No newline at end of file diff --git a/navtreeindex1.js b/navtreeindex1.js index d5207ade..e387073e 100644 --- a/navtreeindex1.js +++ b/navtreeindex1.js @@ -53,6 +53,7 @@ var NAVTREEINDEX1 = "index.html#flatbuffers_overview":[0], "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html":[7,0,1,1,0], "interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a0db9a9033d232d584443a433d7576f4a":[7,0,1,1,0,0], +"interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f":[7,0,1,1,0,1], "modules.html":[7,0], "namespace_flat_buffers.html":[7,1,0,2], "pages.html":[], diff --git a/search/all_f.js b/search/all_f.js index 435d1175..6ff59f22 100644 --- a/search/all_f.js +++ b/search/all_f.js @@ -2,6 +2,7 @@ var searchData= [ ['release',['Release',['../classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45',1,'flatbuffers::FlatBufferBuilder']]], ['releasebufferpointer',['ReleaseBufferPointer',['../classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8',1,'flatbuffers::FlatBufferBuilder']]], + ['releasebytebuffer',['releaseByteBuffer',['../interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f',1,'com::google::flatbuffers::FlatBufferBuilder::ByteBufferFactory']]], ['releaseraw',['ReleaseRaw',['../classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416',1,'flatbuffers::FlatBufferBuilder']]], ['removesizeprefix',['removeSizePrefix',['../classcom_1_1google_1_1flatbuffers_1_1_byte_buffer_util.html#a58d6c39c53a0c981a2f72a5eca7d992c',1,'com::google::flatbuffers::ByteBufferUtil']]] ]; diff --git a/search/functions_b.js b/search/functions_b.js index 435d1175..6ff59f22 100644 --- a/search/functions_b.js +++ b/search/functions_b.js @@ -2,6 +2,7 @@ var searchData= [ ['release',['Release',['../classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45',1,'flatbuffers::FlatBufferBuilder']]], ['releasebufferpointer',['ReleaseBufferPointer',['../classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8',1,'flatbuffers::FlatBufferBuilder']]], + ['releasebytebuffer',['releaseByteBuffer',['../interfacecom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder_1_1_byte_buffer_factory.html#a6cc2f5b5077273da8180b63a5db24b8f',1,'com::google::flatbuffers::FlatBufferBuilder::ByteBufferFactory']]], ['releaseraw',['ReleaseRaw',['../classflatbuffers_1_1_flat_buffer_builder.html#aa090a68856f7b554cc7cac3c279fb416',1,'flatbuffers::FlatBufferBuilder']]], ['removesizeprefix',['removeSizePrefix',['../classcom_1_1google_1_1flatbuffers_1_1_byte_buffer_util.html#a58d6c39c53a0c981a2f72a5eca7d992c',1,'com::google::flatbuffers::ByteBufferUtil']]] ]; -- GitLab