This commit is contained in:
intelliot
2022-12-09 04:19:09 +00:00
parent cc8f6d8908
commit 026fc2fb94
19 changed files with 452 additions and 453 deletions

View File

@@ -189,7 +189,7 @@ $(function() {
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; assert(branch &gt;= 0);</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; </div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; node = <a class="code" href="classripple_1_1SHAMap.html#ad4a7aa36e5d6888012e4e4414f98b73c">unshareNode</a>(std::move(node), nodeID);</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; node-&gt;setChild(branch, child);</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; node-&gt;setChild(branch, std::move(child));</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; </div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; child = std::move(node);</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; }</div>
@@ -789,7 +789,7 @@ $(function() {
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/pop.html">pop</a>();</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; </div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; node = <a class="code" href="classripple_1_1SHAMap.html#ad4a7aa36e5d6888012e4e4414f98b73c">unshareNode</a>(std::move(node), nodeID);</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; node-&gt;setChild(<a class="code" href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">selectBranch</a>(nodeID, <span class="keywordtype">id</span>), prevNode);</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; node-&gt;setChild(<a class="code" href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">selectBranch</a>(nodeID, <span class="keywordtype">id</span>), std::move(prevNode));</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; </div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordflow">if</span> (!nodeID.<a class="code" href="classripple_1_1SHAMapNodeID.html#a205ce1fb183881d67a7b171533141c6b">isRoot</a>())</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; {</div>
@@ -866,406 +866,404 @@ $(function() {
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <span class="keyword">auto</span> inner = std::static_pointer_cast&lt;SHAMapInnerNode&gt;(node);</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; <span class="keywordtype">int</span> branch = <a class="code" href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">selectBranch</a>(nodeID, tag);</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; assert(inner-&gt;isEmptyBranch(branch));</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; <span class="keyword">auto</span> newNode = <a class="code" href="namespaceripple.html#a290b06e05d4261e2042dafbb85f6ccf9">makeTypedLeaf</a>(type, std::move(item), <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>);</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; inner-&gt;setChild(branch, newNode);</div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; }</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; {</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <span class="comment">// this is a leaf node that has to be made an inner node holding two</span></div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <span class="comment">// items</span></div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <span class="keyword">auto</span> leaf = std::static_pointer_cast&lt;SHAMapLeafNode&gt;(node);</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapItem const&gt;</a> otherItem = leaf-&gt;peekItem();</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; assert(otherItem &amp;&amp; (tag != otherItem-&gt;key()));</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; </div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; node = std::make_shared&lt;SHAMapInnerNode&gt;(node-&gt;cowid());</div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; </div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> b1, b2;</div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; </div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <span class="keywordflow">while</span> ((b1 = <a class="code" href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">selectBranch</a>(nodeID, tag)) ==</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; (b2 = <a class="code" href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">selectBranch</a>(nodeID, otherItem-&gt;key())))</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; {</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/push.html">push</a>({node, nodeID});</div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; </div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="comment">// we need a new inner node, since both go on same branch at this</span></div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="comment">// level</span></div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; nodeID = nodeID.getChildNodeID(b1);</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; node = std::make_shared&lt;SHAMapInnerNode&gt;(<a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>);</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; }</div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; </div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="comment">// we can add the two leaf nodes here</span></div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; assert(node-&gt;isInner());</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; </div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <span class="keyword">auto</span> inner = <span class="keyword">static_cast&lt;</span><a class="code" href="classripple_1_1SHAMapInnerNode.html">SHAMapInnerNode</a>*<span class="keyword">&gt;</span>(node.<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr/get.html">get</a>());</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; inner-&gt;<a class="code" href="classripple_1_1SHAMapInnerNode.html#a816fb1a18b49832dcffccc073a5dd929">setChild</a>(b1, <a class="code" href="namespaceripple.html#a290b06e05d4261e2042dafbb85f6ccf9">makeTypedLeaf</a>(type, std::move(item), <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>));</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; inner-&gt;setChild(b2, <a class="code" href="namespaceripple.html#a290b06e05d4261e2042dafbb85f6ccf9">makeTypedLeaf</a>(type, std::move(otherItem), <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>));</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; }</div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; </div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a36ba184d7125776bff17e081e9e1d7ed">dirtyUp</a>(stack, tag, node);</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160;}</div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; </div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00837"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ad628222b8fa175537889873ff6724cc0"> 837</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ad628222b8fa175537889873ff6724cc0">SHAMap::addItem</a>(<a class="code" href="namespaceripple.html#ae0356b1de00f841c554c830be509dd58">SHAMapNodeType</a> type, <a class="code" href="classripple_1_1SHAMapItem.html">SHAMapItem</a>&amp;&amp; i)</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160;{</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1SHAMap.html#a9bc9928b273e0467788329faa8f65e96">addGiveItem</a>(type, std::make_shared&lt;SHAMapItem const&gt;(std::move(i)));</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160;}</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; </div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160;<a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a></div>
<div class="line"><a name="l00843"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079"> 843</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079">SHAMap::getHash</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <span class="keyword">auto</span> hash = <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash();</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keywordflow">if</span> (hash.isZero())</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; {</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <span class="keyword">const_cast&lt;</span><a class="code" href="classripple_1_1SHAMap.html">SHAMap</a>&amp;<span class="keyword">&gt;</span>(*this).<a class="code" href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb">unshare</a>();</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; hash = <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash();</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; }</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <span class="keywordflow">return</span> hash;</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160;}</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; </div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00855"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ab40ce9ae2e8df178c78440b40b6a2cda"> 855</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ab40ce9ae2e8df178c78440b40b6a2cda">SHAMap::updateGiveItem</a>(</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <a class="code" href="namespaceripple.html#ae0356b1de00f841c554c830be509dd58">SHAMapNodeType</a> type,</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapItem const&gt;</a> item)</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160;{</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="comment">// can&#39;t change the tag but can change the hash</span></div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> tag = item-&gt;key();</div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; </div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a50ed233b23a5065f500249cf23f1a183">state_</a> != <a class="code" href="namespaceripple.html#a49003667116eb98c6e966f36e5dd1c77a11efd9ae6f76e706e3f1b34d97584ebc">SHAMapState::Immutable</a>);</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; </div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">SharedPtrNodeStack</a> stack;</div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a57c9afd6af077bbca5efc4ee640c7a2d">walkTowardsKey</a>(tag, &amp;stack);</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; </div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; <span class="keywordflow">if</span> (stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/empty.html">empty</a>())</div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; Throw&lt;SHAMapMissingNode&gt;(<a class="code" href="classripple_1_1SHAMap.html#a343edca635d6cf2df19026569be34313">type_</a>, tag);</div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; </div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="keyword">auto</span> node = std::dynamic_pointer_cast&lt;SHAMapLeafNode&gt;(stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">first</a>);</div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <span class="keyword">auto</span> nodeID = stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">second</a>;</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/pop.html">pop</a>();</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; </div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="keywordflow">if</span> (!node || (node-&gt;peekItem()-&gt;key() != tag))</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; {</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; assert(<span class="keyword">false</span>);</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; }</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; </div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">if</span> (node-&gt;getType() != type)</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; {</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a3dfb8e2e3eecccdb5cf78ff21bca069c">fatal</a>()) &lt;&lt; <span class="stringliteral">&quot;SHAMap::setItem: cross-type change!&quot;</span>;</div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; }</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; </div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; node = <a class="code" href="classripple_1_1SHAMap.html#ad4a7aa36e5d6888012e4e4414f98b73c">unshareNode</a>(std::move(node), nodeID);</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; </div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <span class="keywordflow">if</span> (node-&gt;setItem(std::move(item)))</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a36ba184d7125776bff17e081e9e1d7ed">dirtyUp</a>(stack, tag, node);</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; </div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160;}</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; </div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00895"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ad530edc60b33c2eb590d2be1cb12f2de"> 895</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ad530edc60b33c2eb590d2be1cb12f2de">SHAMap::fetchRoot</a>(<a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a> <span class="keyword">const</span>&amp; hash, <a class="code" href="classripple_1_1SHAMapSyncFilter.html">SHAMapSyncFilter</a>* filter)</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160;{</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; <span class="keywordflow">if</span> (hash == <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash())</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; </div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> stream = <a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>())</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; {</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1SHAMap.html#a343edca635d6cf2df19026569be34313">type_</a> == <a class="code" href="namespaceripple.html#a5d9fe757c37a7602a883d30b14e1bf3cae6bed345f53943469741d7295552fcd4">SHAMapType::TRANSACTION</a>)</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; {</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; stream &lt;&lt; <span class="stringliteral">&quot;Fetch root TXN node &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; }</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1SHAMap.html#a343edca635d6cf2df19026569be34313">type_</a> == <a class="code" href="namespaceripple.html#a5d9fe757c37a7602a883d30b14e1bf3ca2b848a8cc886d253d21a77c43cd50aae">SHAMapType::STATE</a>)</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; {</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; stream &lt;&lt; <span class="stringliteral">&quot;Fetch root STATE node &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; }</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; {</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; stream &lt;&lt; <span class="stringliteral">&quot;Fetch root SHAMap node &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; }</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; }</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; </div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; <span class="keyword">auto</span> newRoot = <a class="code" href="classripple_1_1SHAMap.html#a03833149ffd297c6817572a2c082a3c7">fetchNodeNT</a>(hash, filter);</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; </div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <span class="keywordflow">if</span> (newRoot)</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; {</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = newRoot;</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash() == hash);</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; }</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; </div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160;}</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; </div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a></div>
<div class="line"><a name="l00941"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9"> 941</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">SHAMap::writeNode</a>(<a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3">NodeObjectType</a> t, <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a> node)<span class="keyword"> const</span></div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; assert(node-&gt;cowid() == 0);</div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>);</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; </div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972">canonicalize</a>(node-&gt;getHash(), node);</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; </div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; <a class="code" href="classripple_1_1Serializer.html">Serializer</a> s;</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; node-&gt;serializeWithPrefix(s);</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5268c936212da93659dd05be9304e0bb">f_</a>.<a class="code" href="classripple_1_1Family.html#a2618f6f7bd3709acf853db111c814df2">db</a>().<a class="code" href="classripple_1_1NodeStore_1_1Database.html#a7da2336581ee3348aad97c0d885658d0">store</a>(</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; t, std::move(s.<a class="code" href="classripple_1_1Serializer.html#a6d7436e5990cb278bd924cef9396df3c">modData</a>()), node-&gt;getHash().as_uint256(), <a class="code" href="classripple_1_1SHAMap.html#acbedaf0be7acd2816e01be821fdc4697">ledgerSeq_</a>);</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; <span class="keywordflow">return</span> node;</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160;}</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; </div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160;<span class="comment">// We can&#39;t modify an inner node someone else might have a</span></div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160;<span class="comment">// pointer to because flushing modifies inner nodes -- it</span></div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160;<span class="comment">// makes them point to canonical/shared nodes.</span></div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Node&gt;</div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Node&gt;</a></div>
<div class="line"><a name="l00960"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85"> 960</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">SHAMap::preFlushNode</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Node&gt;</a> node)<span class="keyword"> const</span></div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="comment">// A shared node should never need to be flushed</span></div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; <span class="comment">// because that would imply someone modified it</span></div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; assert(node-&gt;cowid() != 0);</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; </div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; <span class="keywordflow">if</span> (node-&gt;cowid() != <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>)</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; {</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="comment">// Node is not uniquely ours, so unshare it before</span></div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; <span class="comment">// possibly modifying it</span></div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; node = std::static_pointer_cast&lt;Node&gt;(node-&gt;clone(<a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>));</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; }</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; <span class="keywordflow">return</span> node;</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160;}</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; </div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00976"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb"> 976</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb">SHAMap::unshare</a>()</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160;{</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; <span class="comment">// Don&#39;t share nodes with parent map</span></div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">walkSubTree</a>(<span class="keyword">false</span>, <a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3ac9d2b0df1bd24ef0d09db1040dceac6b">hotUNKNOWN</a>);</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160;}</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; </div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00983"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ae6fddc16c43b58e725afde738f4a70a8"> 983</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ae6fddc16c43b58e725afde738f4a70a8">SHAMap::flushDirty</a>(<a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3">NodeObjectType</a> t)</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160;{</div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <span class="comment">// We only write back if this map is backed.</span></div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">walkSubTree</a>(<a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>, t);</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160;}</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; </div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00990"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2"> 990</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">SHAMap::walkSubTree</a>(<span class="keywordtype">bool</span> doWrite, <a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3">NodeObjectType</a> t)</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160;{</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; assert(!doWrite || <a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>);</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; </div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; <span class="keywordtype">int</span> flushed = 0;</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; </div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> || (<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;cowid() == 0))</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; <span class="keywordflow">return</span> flushed;</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; </div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;isLeaf())</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; { <span class="comment">// special case -- root_ is leaf</span></div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = <a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">preFlushNode</a>(std::move(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>));</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;updateHash();</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;unshare();</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; </div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <span class="keywordflow">if</span> (doWrite)</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = <a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">writeNode</a>(t, std::move(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>));</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; </div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; }</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; </div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; <span class="keyword">auto</span> node = std::static_pointer_cast&lt;SHAMapInnerNode&gt;(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>);</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; </div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; <span class="keywordflow">if</span> (node-&gt;isEmpty())</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; { <span class="comment">// replace empty root with a new empty root</span></div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = std::make_shared&lt;SHAMapInnerNode&gt;(0);</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; }</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; </div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; <span class="comment">// Stack of {parent,index,child} pointers representing</span></div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; <span class="comment">// inner nodes we are in the process of flushing</span></div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; <span class="keyword">using</span> StackEntry = <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair&lt;std::shared_ptr&lt;SHAMapInnerNode&gt;</a>, <span class="keywordtype">int</span>&gt;;</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">std::stack&lt;StackEntry, std::vector&lt;StackEntry&gt;</a>&gt; stack;</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; </div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; node = <a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">preFlushNode</a>(std::move(node));</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; </div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; <span class="keywordtype">int</span> pos = 0;</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; </div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; <span class="comment">// We can&#39;t flush an inner node until we flush its children</span></div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; <span class="keywordflow">while</span> (1)</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; {</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; <span class="keywordflow">while</span> (pos &lt; <a class="code" href="classripple_1_1SHAMap.html#af8599964238eb94d795606f220654db9">branchFactor</a>)</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; {</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <span class="keywordflow">if</span> (node-&gt;isEmptyBranch(pos))</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; {</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; ++pos;</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; }</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; {</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <span class="comment">// No need to do I/O. If the node isn&#39;t linked,</span></div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="comment">// it can&#39;t need to be flushed</span></div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; <span class="keywordtype">int</span> branch = pos;</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; <span class="keyword">auto</span> child = node-&gt;getChild(pos++);</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; </div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">if</span> (child &amp;&amp; (child-&gt;cowid() != 0))</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; {</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; <span class="comment">// This is a node that needs to be flushed</span></div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; </div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; child = <a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">preFlushNode</a>(std::move(child));</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; </div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <span class="keywordflow">if</span> (child-&gt;isInner())</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; {</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="comment">// save our place and work on this node</span></div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; </div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/emplace.html">emplace</a>(std::move(node), branch);</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; <span class="comment">// The semantics of this changes when we move to c++-20</span></div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="comment">// Right now no move will occur; With c++-20 child will</span></div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; <span class="comment">// be moved from.</span></div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; node = std::static_pointer_cast&lt;SHAMapInnerNode&gt;(</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; std::move(child));</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; pos = 0;</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; }</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; {</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; <span class="comment">// flush this leaf</span></div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; ++flushed;</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; </div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; assert(node-&gt;cowid() == <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>);</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; child-&gt;updateHash();</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; child-&gt;unshare();</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; </div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="keywordflow">if</span> (doWrite)</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; child = <a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">writeNode</a>(t, std::move(child));</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; </div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; node-&gt;shareChild(branch, child);</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; }</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; }</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; }</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; }</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; </div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; <span class="comment">// update the hash of this inner node</span></div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; node-&gt;updateHashDeep();</div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; </div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; <span class="comment">// This inner node can now be shared</span></div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; node-&gt;unshare();</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; </div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="keywordflow">if</span> (doWrite)</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; node = std::static_pointer_cast&lt;SHAMapInnerNode&gt;(</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">writeNode</a>(t, std::move(node)));</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; </div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; ++flushed;</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; </div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <span class="keywordflow">if</span> (stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/empty.html">empty</a>())</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; </div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; <span class="keyword">auto</span> parent = std::move(stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().first);</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; pos = stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().second;</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/pop.html">pop</a>();</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; </div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; <span class="comment">// Hook this inner node to its parent</span></div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; assert(parent-&gt;cowid() == <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>);</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; parent-&gt;shareChild(pos, node);</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; </div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; <span class="comment">// Continue with parent&#39;s next child, if any</span></div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; node = std::move(parent);</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; ++pos;</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; }</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; </div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; <span class="comment">// Last inner node is the new root_</span></div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = std::move(node);</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; </div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; <span class="keywordflow">return</span> flushed;</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;}</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; </div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01115"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a16c47b967da5fd093f51e7331f42c9b6"> 1115</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a16c47b967da5fd093f51e7331f42c9b6">SHAMap::dump</a>(<span class="keywordtype">bool</span> hash)<span class="keyword"> const</span></div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; <span class="keywordtype">int</span> leafCount = 0;</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot; MAP Contains&quot;</span>;</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; </div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">std::stack&lt;std::pair&lt;SHAMapTreeNode*, SHAMapNodeID&gt;</a>&gt; stack;</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/push.html">push</a>({<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>.get(), <a class="code" href="classripple_1_1SHAMapNodeID.html">SHAMapNodeID</a>()});</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; </div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; <span class="keywordflow">do</span></div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; {</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; <span class="keyword">auto</span> [node, nodeID] = stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>();</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/pop.html">pop</a>();</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; </div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; node-&gt;getString(nodeID);</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; <span class="keywordflow">if</span> (hash)</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; {</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Hash: &quot;</span> &lt;&lt; node-&gt;getHash();</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; }</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; </div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; <span class="keywordflow">if</span> (node-&gt;isInner())</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; {</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; <span class="keyword">auto</span> inner = <span class="keyword">static_cast&lt;</span><a class="code" href="classripple_1_1SHAMapInnerNode.html">SHAMapInnerNode</a>*<span class="keyword">&gt;</span>(node);</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="classripple_1_1SHAMap.html#af8599964238eb94d795606f220654db9">branchFactor</a>; ++i)</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; {</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; <span class="keywordflow">if</span> (!inner-&gt;isEmptyBranch(i))</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; {</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; <span class="keyword">auto</span> child = inner-&gt;getChildPointer(i);</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; <span class="keywordflow">if</span> (child)</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; {</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; assert(child-&gt;getHash() == inner-&gt;getChildHash(i));</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/push.html">push</a>({child, nodeID.getChildNodeID(i)});</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; }</div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; }</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; }</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; }</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; ++leafCount;</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; } <span class="keywordflow">while</span> (!stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/empty.html">empty</a>());</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; </div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; leafCount &lt;&lt; <span class="stringliteral">&quot; resident leaves&quot;</span>;</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;}</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; </div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a></div>
<div class="line"><a name="l01158"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ab39da8aa57430441b1f4fdce7fe6cbfe"> 1158</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ab39da8aa57430441b1f4fdce7fe6cbfe">SHAMap::cacheLookup</a>(<a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a> <span class="keyword">const</span>&amp; hash)<span class="keyword"> const</span></div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; <span class="keyword">auto</span> ret = <a class="code" href="classripple_1_1SHAMap.html#a5268c936212da93659dd05be9304e0bb">f_</a>.<a class="code" href="classripple_1_1Family.html#a794019ebd9859fb37a7a65b80e8d6df7">getTreeNodeCache</a>(<a class="code" href="classripple_1_1SHAMap.html#acbedaf0be7acd2816e01be821fdc4697">ledgerSeq_</a>)-&gt;fetch(hash.<a class="code" href="classripple_1_1SHAMapHash.html#a8f95b5bc14b7085d368f56aeaa17ef4f">as_uint256</a>());</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; assert(!ret || !ret-&gt;cowid());</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; <span class="keywordflow">return</span> ret;</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;}</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; </div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01166"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972"> 1166</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972">SHAMap::canonicalize</a>(</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; <a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a>&amp; node)<span class="keyword"> const</span></div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>);</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; assert(node-&gt;cowid() == 0);</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; assert(node-&gt;getHash() == hash);</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; </div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5268c936212da93659dd05be9304e0bb">f_</a>.<a class="code" href="classripple_1_1Family.html#a794019ebd9859fb37a7a65b80e8d6df7">getTreeNodeCache</a>(<a class="code" href="classripple_1_1SHAMap.html#acbedaf0be7acd2816e01be821fdc4697">ledgerSeq_</a>)</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; -&gt;canonicalize_replace_client(hash.<a class="code" href="classripple_1_1SHAMapHash.html#a8f95b5bc14b7085d368f56aeaa17ef4f">as_uint256</a>(), node);</div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;}</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; </div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01179"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a721b11739ad539851737443deeccf96b"> 1179</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a721b11739ad539851737443deeccf96b">SHAMap::invariants</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; (void)<a class="code" href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079">getHash</a>(); <span class="comment">// update node hashes</span></div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; <span class="keyword">auto</span> node = <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>.get();</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; assert(node != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; assert(!node-&gt;isLeaf());</div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">SharedPtrNodeStack</a> stack;</div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> leaf = <a class="code" href="classripple_1_1SHAMap.html#aa349ff193020caf2178e28ef6392e675">peekFirstItem</a>(stack); leaf != <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; leaf = <a class="code" href="classripple_1_1SHAMap.html#a5902b212b3da87e522eef58c6c0c83e9">peekNextItem</a>(leaf-&gt;peekItem()-&gt;key(), stack))</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160; ;</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; node-&gt;invariants(<span class="keyword">true</span>);</div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;}</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; </div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;} <span class="comment">// namespace ripple</span></div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; inner-&gt;setChild(branch, <a class="code" href="namespaceripple.html#a290b06e05d4261e2042dafbb85f6ccf9">makeTypedLeaf</a>(type, std::move(item), <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>));</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; }</div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; {</div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <span class="comment">// this is a leaf node that has to be made an inner node holding two</span></div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <span class="comment">// items</span></div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <span class="keyword">auto</span> leaf = std::static_pointer_cast&lt;SHAMapLeafNode&gt;(node);</div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapItem const&gt;</a> otherItem = leaf-&gt;peekItem();</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; assert(otherItem &amp;&amp; (tag != otherItem-&gt;key()));</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; </div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; node = std::make_shared&lt;SHAMapInnerNode&gt;(node-&gt;cowid());</div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; </div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> b1, b2;</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; </div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <span class="keywordflow">while</span> ((b1 = <a class="code" href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">selectBranch</a>(nodeID, tag)) ==</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; (b2 = <a class="code" href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">selectBranch</a>(nodeID, otherItem-&gt;key())))</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; {</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/push.html">push</a>({node, nodeID});</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; </div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="comment">// we need a new inner node, since both go on same branch at this</span></div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="comment">// level</span></div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; nodeID = nodeID.getChildNodeID(b1);</div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; node = std::make_shared&lt;SHAMapInnerNode&gt;(<a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>);</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; }</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; </div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <span class="comment">// we can add the two leaf nodes here</span></div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; assert(node-&gt;isInner());</div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; </div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <span class="keyword">auto</span> inner = <span class="keyword">static_cast&lt;</span><a class="code" href="classripple_1_1SHAMapInnerNode.html">SHAMapInnerNode</a>*<span class="keyword">&gt;</span>(node.<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr/get.html">get</a>());</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; inner-&gt;<a class="code" href="classripple_1_1SHAMapInnerNode.html#a7fb5fc0e5d65ed4c3c77537a8fda8d32">setChild</a>(b1, <a class="code" href="namespaceripple.html#a290b06e05d4261e2042dafbb85f6ccf9">makeTypedLeaf</a>(type, std::move(item), <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>));</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; inner-&gt;setChild(b2, <a class="code" href="namespaceripple.html#a290b06e05d4261e2042dafbb85f6ccf9">makeTypedLeaf</a>(type, std::move(otherItem), <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>));</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; }</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; </div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a36ba184d7125776bff17e081e9e1d7ed">dirtyUp</a>(stack, tag, node);</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160;}</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; </div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00836"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ad628222b8fa175537889873ff6724cc0"> 836</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ad628222b8fa175537889873ff6724cc0">SHAMap::addItem</a>(<a class="code" href="namespaceripple.html#ae0356b1de00f841c554c830be509dd58">SHAMapNodeType</a> type, <a class="code" href="classripple_1_1SHAMapItem.html">SHAMapItem</a>&amp;&amp; i)</div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160;{</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1SHAMap.html#a9bc9928b273e0467788329faa8f65e96">addGiveItem</a>(type, std::make_shared&lt;SHAMapItem const&gt;(std::move(i)));</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160;}</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; </div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160;<a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a></div>
<div class="line"><a name="l00842"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079"> 842</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079">SHAMap::getHash</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; <span class="keyword">auto</span> hash = <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash();</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <span class="keywordflow">if</span> (hash.isZero())</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; {</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <span class="keyword">const_cast&lt;</span><a class="code" href="classripple_1_1SHAMap.html">SHAMap</a>&amp;<span class="keyword">&gt;</span>(*this).<a class="code" href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb">unshare</a>();</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; hash = <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash();</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; }</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; <span class="keywordflow">return</span> hash;</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160;}</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; </div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00854"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ab40ce9ae2e8df178c78440b40b6a2cda"> 854</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ab40ce9ae2e8df178c78440b40b6a2cda">SHAMap::updateGiveItem</a>(</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <a class="code" href="namespaceripple.html#ae0356b1de00f841c554c830be509dd58">SHAMapNodeType</a> type,</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapItem const&gt;</a> item)</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160;{</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="comment">// can&#39;t change the tag but can change the hash</span></div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> tag = item-&gt;key();</div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; </div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a50ed233b23a5065f500249cf23f1a183">state_</a> != <a class="code" href="namespaceripple.html#a49003667116eb98c6e966f36e5dd1c77a11efd9ae6f76e706e3f1b34d97584ebc">SHAMapState::Immutable</a>);</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; </div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">SharedPtrNodeStack</a> stack;</div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a57c9afd6af077bbca5efc4ee640c7a2d">walkTowardsKey</a>(tag, &amp;stack);</div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; </div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="keywordflow">if</span> (stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/empty.html">empty</a>())</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; Throw&lt;SHAMapMissingNode&gt;(<a class="code" href="classripple_1_1SHAMap.html#a343edca635d6cf2df19026569be34313">type_</a>, tag);</div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; </div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <span class="keyword">auto</span> node = std::dynamic_pointer_cast&lt;SHAMapLeafNode&gt;(stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">first</a>);</div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="keyword">auto</span> nodeID = stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">second</a>;</div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/pop.html">pop</a>();</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; </div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <span class="keywordflow">if</span> (!node || (node-&gt;peekItem()-&gt;key() != tag))</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; {</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; assert(<span class="keyword">false</span>);</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; }</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; </div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="keywordflow">if</span> (node-&gt;getType() != type)</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; {</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a3dfb8e2e3eecccdb5cf78ff21bca069c">fatal</a>()) &lt;&lt; <span class="stringliteral">&quot;SHAMap::setItem: cross-type change!&quot;</span>;</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; }</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; </div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; node = <a class="code" href="classripple_1_1SHAMap.html#ad4a7aa36e5d6888012e4e4414f98b73c">unshareNode</a>(std::move(node), nodeID);</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; </div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <span class="keywordflow">if</span> (node-&gt;setItem(std::move(item)))</div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a36ba184d7125776bff17e081e9e1d7ed">dirtyUp</a>(stack, tag, node);</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; </div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160;}</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; </div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00894"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ad530edc60b33c2eb590d2be1cb12f2de"> 894</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ad530edc60b33c2eb590d2be1cb12f2de">SHAMap::fetchRoot</a>(<a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a> <span class="keyword">const</span>&amp; hash, <a class="code" href="classripple_1_1SHAMapSyncFilter.html">SHAMapSyncFilter</a>* filter)</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160;{</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; <span class="keywordflow">if</span> (hash == <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash())</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; </div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> stream = <a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>())</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; {</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1SHAMap.html#a343edca635d6cf2df19026569be34313">type_</a> == <a class="code" href="namespaceripple.html#a5d9fe757c37a7602a883d30b14e1bf3cae6bed345f53943469741d7295552fcd4">SHAMapType::TRANSACTION</a>)</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; {</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; stream &lt;&lt; <span class="stringliteral">&quot;Fetch root TXN node &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; }</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1SHAMap.html#a343edca635d6cf2df19026569be34313">type_</a> == <a class="code" href="namespaceripple.html#a5d9fe757c37a7602a883d30b14e1bf3ca2b848a8cc886d253d21a77c43cd50aae">SHAMapType::STATE</a>)</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; {</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; stream &lt;&lt; <span class="stringliteral">&quot;Fetch root STATE node &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; }</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; {</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; stream &lt;&lt; <span class="stringliteral">&quot;Fetch root SHAMap node &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; }</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; }</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; </div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; <span class="keyword">auto</span> newRoot = <a class="code" href="classripple_1_1SHAMap.html#a03833149ffd297c6817572a2c082a3c7">fetchNodeNT</a>(hash, filter);</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; </div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; <span class="keywordflow">if</span> (newRoot)</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; {</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = newRoot;</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;getHash() == hash);</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; }</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; </div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160;}</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; </div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a></div>
<div class="line"><a name="l00940"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9"> 940</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">SHAMap::writeNode</a>(<a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3">NodeObjectType</a> t, <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a> node)<span class="keyword"> const</span></div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; assert(node-&gt;cowid() == 0);</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>);</div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; </div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972">canonicalize</a>(node-&gt;getHash(), node);</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; </div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <a class="code" href="classripple_1_1Serializer.html">Serializer</a> s;</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; node-&gt;serializeWithPrefix(s);</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5268c936212da93659dd05be9304e0bb">f_</a>.<a class="code" href="classripple_1_1Family.html#a2618f6f7bd3709acf853db111c814df2">db</a>().<a class="code" href="classripple_1_1NodeStore_1_1Database.html#a7da2336581ee3348aad97c0d885658d0">store</a>(</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; t, std::move(s.<a class="code" href="classripple_1_1Serializer.html#a6d7436e5990cb278bd924cef9396df3c">modData</a>()), node-&gt;getHash().as_uint256(), <a class="code" href="classripple_1_1SHAMap.html#acbedaf0be7acd2816e01be821fdc4697">ledgerSeq_</a>);</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; <span class="keywordflow">return</span> node;</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160;}</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; </div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160;<span class="comment">// We can&#39;t modify an inner node someone else might have a</span></div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160;<span class="comment">// pointer to because flushing modifies inner nodes -- it</span></div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160;<span class="comment">// makes them point to canonical/shared nodes.</span></div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Node&gt;</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Node&gt;</a></div>
<div class="line"><a name="l00959"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85"> 959</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">SHAMap::preFlushNode</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Node&gt;</a> node)<span class="keyword"> const</span></div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; <span class="comment">// A shared node should never need to be flushed</span></div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="comment">// because that would imply someone modified it</span></div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; assert(node-&gt;cowid() != 0);</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; </div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <span class="keywordflow">if</span> (node-&gt;cowid() != <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>)</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; {</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; <span class="comment">// Node is not uniquely ours, so unshare it before</span></div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="comment">// possibly modifying it</span></div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; node = std::static_pointer_cast&lt;Node&gt;(node-&gt;clone(<a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>));</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; }</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <span class="keywordflow">return</span> node;</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160;}</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; </div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00975"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb"> 975</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb">SHAMap::unshare</a>()</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160;{</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; <span class="comment">// Don&#39;t share nodes with parent map</span></div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">walkSubTree</a>(<span class="keyword">false</span>, <a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3ac9d2b0df1bd24ef0d09db1040dceac6b">hotUNKNOWN</a>);</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160;}</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; </div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00982"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ae6fddc16c43b58e725afde738f4a70a8"> 982</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ae6fddc16c43b58e725afde738f4a70a8">SHAMap::flushDirty</a>(<a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3">NodeObjectType</a> t)</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160;{</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; <span class="comment">// We only write back if this map is backed.</span></div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">walkSubTree</a>(<a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>, t);</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160;}</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; </div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2"> 989</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">SHAMap::walkSubTree</a>(<span class="keywordtype">bool</span> doWrite, <a class="code" href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3">NodeObjectType</a> t)</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160;{</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; assert(!doWrite || <a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>);</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; </div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <span class="keywordtype">int</span> flushed = 0;</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; </div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> || (<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;cowid() == 0))</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; <span class="keywordflow">return</span> flushed;</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; </div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;isLeaf())</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; { <span class="comment">// special case -- root_ is leaf</span></div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = <a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">preFlushNode</a>(std::move(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>));</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;updateHash();</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>-&gt;unshare();</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; </div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; <span class="keywordflow">if</span> (doWrite)</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = <a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">writeNode</a>(t, std::move(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>));</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; </div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; }</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; </div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="keyword">auto</span> node = std::static_pointer_cast&lt;SHAMapInnerNode&gt;(<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>);</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; </div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; <span class="keywordflow">if</span> (node-&gt;isEmpty())</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; { <span class="comment">// replace empty root with a new empty root</span></div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = std::make_shared&lt;SHAMapInnerNode&gt;(0);</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; }</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; </div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; <span class="comment">// Stack of {parent,index,child} pointers representing</span></div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; <span class="comment">// inner nodes we are in the process of flushing</span></div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; <span class="keyword">using</span> StackEntry = <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair&lt;std::shared_ptr&lt;SHAMapInnerNode&gt;</a>, <span class="keywordtype">int</span>&gt;;</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">std::stack&lt;StackEntry, std::vector&lt;StackEntry&gt;</a>&gt; stack;</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; </div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; node = <a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">preFlushNode</a>(std::move(node));</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; </div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; <span class="keywordtype">int</span> pos = 0;</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; </div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <span class="comment">// We can&#39;t flush an inner node until we flush its children</span></div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; <span class="keywordflow">while</span> (1)</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; {</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; <span class="keywordflow">while</span> (pos &lt; <a class="code" href="classripple_1_1SHAMap.html#af8599964238eb94d795606f220654db9">branchFactor</a>)</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; {</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; <span class="keywordflow">if</span> (node-&gt;isEmptyBranch(pos))</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; {</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; ++pos;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; }</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; {</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; <span class="comment">// No need to do I/O. If the node isn&#39;t linked,</span></div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <span class="comment">// it can&#39;t need to be flushed</span></div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="keywordtype">int</span> branch = pos;</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; <span class="keyword">auto</span> child = node-&gt;getChild(pos++);</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; </div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; <span class="keywordflow">if</span> (child &amp;&amp; (child-&gt;cowid() != 0))</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; {</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; <span class="comment">// This is a node that needs to be flushed</span></div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; </div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; child = <a class="code" href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">preFlushNode</a>(std::move(child));</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; </div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; <span class="keywordflow">if</span> (child-&gt;isInner())</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; {</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; <span class="comment">// save our place and work on this node</span></div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; </div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/emplace.html">emplace</a>(std::move(node), branch);</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; <span class="comment">// The semantics of this changes when we move to c++-20</span></div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; <span class="comment">// Right now no move will occur; With c++-20 child will</span></div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="comment">// be moved from.</span></div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; node = std::static_pointer_cast&lt;SHAMapInnerNode&gt;(</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; std::move(child));</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; pos = 0;</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; }</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; {</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <span class="comment">// flush this leaf</span></div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; ++flushed;</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; </div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; assert(node-&gt;cowid() == <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>);</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; child-&gt;updateHash();</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; child-&gt;unshare();</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; </div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; <span class="keywordflow">if</span> (doWrite)</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; child = <a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">writeNode</a>(t, std::move(child));</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; </div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; node-&gt;shareChild(branch, child);</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; }</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; }</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; }</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; }</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; </div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; <span class="comment">// update the hash of this inner node</span></div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; node-&gt;updateHashDeep();</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; </div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; <span class="comment">// This inner node can now be shared</span></div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; node-&gt;unshare();</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; </div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; <span class="keywordflow">if</span> (doWrite)</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; node = std::static_pointer_cast&lt;SHAMapInnerNode&gt;(</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">writeNode</a>(t, std::move(node)));</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; </div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; ++flushed;</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; </div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; <span class="keywordflow">if</span> (stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/empty.html">empty</a>())</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; </div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; <span class="keyword">auto</span> parent = std::move(stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().first);</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; pos = stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>().second;</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/pop.html">pop</a>();</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; </div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="comment">// Hook this inner node to its parent</span></div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; assert(parent-&gt;cowid() == <a class="code" href="classripple_1_1SHAMap.html#a9ab1e2b9e495808a7e7b7ce4483460a0">cowid_</a>);</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; parent-&gt;shareChild(pos, node);</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; </div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; <span class="comment">// Continue with parent&#39;s next child, if any</span></div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; node = std::move(parent);</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; ++pos;</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; }</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; </div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="comment">// Last inner node is the new root_</span></div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a> = std::move(node);</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; </div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; <span class="keywordflow">return</span> flushed;</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;}</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; </div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01114"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a16c47b967da5fd093f51e7331f42c9b6"> 1114</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a16c47b967da5fd093f51e7331f42c9b6">SHAMap::dump</a>(<span class="keywordtype">bool</span> hash)<span class="keyword"> const</span></div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; <span class="keywordtype">int</span> leafCount = 0;</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot; MAP Contains&quot;</span>;</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; </div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">std::stack&lt;std::pair&lt;SHAMapTreeNode*, SHAMapNodeID&gt;</a>&gt; stack;</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/push.html">push</a>({<a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>.get(), <a class="code" href="classripple_1_1SHAMapNodeID.html">SHAMapNodeID</a>()});</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; </div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <span class="keywordflow">do</span></div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; {</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; <span class="keyword">auto</span> [node, nodeID] = stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/top.html">top</a>();</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/pop.html">pop</a>();</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; </div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; node-&gt;getString(nodeID);</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; <span class="keywordflow">if</span> (hash)</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; {</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Hash: &quot;</span> &lt;&lt; node-&gt;getHash();</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; }</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; </div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; <span class="keywordflow">if</span> (node-&gt;isInner())</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; {</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; <span class="keyword">auto</span> inner = <span class="keyword">static_cast&lt;</span><a class="code" href="classripple_1_1SHAMapInnerNode.html">SHAMapInnerNode</a>*<span class="keyword">&gt;</span>(node);</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="classripple_1_1SHAMap.html#af8599964238eb94d795606f220654db9">branchFactor</a>; ++i)</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; {</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <span class="keywordflow">if</span> (!inner-&gt;isEmptyBranch(i))</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; {</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <span class="keyword">auto</span> child = inner-&gt;getChildPointer(i);</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; <span class="keywordflow">if</span> (child)</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; {</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; assert(child-&gt;getHash() == inner-&gt;getChildHash(i));</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/push.html">push</a>({child, nodeID.getChildNodeID(i)});</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; }</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; }</div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; }</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; }</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; ++leafCount;</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; } <span class="keywordflow">while</span> (!stack.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack/empty.html">empty</a>());</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; </div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; JLOG(<a class="code" href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">journal_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; leafCount &lt;&lt; <span class="stringliteral">&quot; resident leaves&quot;</span>;</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;}</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; </div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a></div>
<div class="line"><a name="l01157"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ab39da8aa57430441b1f4fdce7fe6cbfe"> 1157</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ab39da8aa57430441b1f4fdce7fe6cbfe">SHAMap::cacheLookup</a>(<a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a> <span class="keyword">const</span>&amp; hash)<span class="keyword"> const</span></div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; <span class="keyword">auto</span> ret = <a class="code" href="classripple_1_1SHAMap.html#a5268c936212da93659dd05be9304e0bb">f_</a>.<a class="code" href="classripple_1_1Family.html#a794019ebd9859fb37a7a65b80e8d6df7">getTreeNodeCache</a>(<a class="code" href="classripple_1_1SHAMap.html#acbedaf0be7acd2816e01be821fdc4697">ledgerSeq_</a>)-&gt;fetch(hash.<a class="code" href="classripple_1_1SHAMapHash.html#a8f95b5bc14b7085d368f56aeaa17ef4f">as_uint256</a>());</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; assert(!ret || !ret-&gt;cowid());</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; <span class="keywordflow">return</span> ret;</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;}</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; </div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01165"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972"> 1165</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972">SHAMap::canonicalize</a>(</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; <a class="code" href="classripple_1_1SHAMapHash.html">SHAMapHash</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;SHAMapTreeNode&gt;</a>&amp; node)<span class="keyword"> const</span></div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; assert(<a class="code" href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">backed_</a>);</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; assert(node-&gt;cowid() == 0);</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; assert(node-&gt;getHash() == hash);</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; </div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; <a class="code" href="classripple_1_1SHAMap.html#a5268c936212da93659dd05be9304e0bb">f_</a>.<a class="code" href="classripple_1_1Family.html#a794019ebd9859fb37a7a65b80e8d6df7">getTreeNodeCache</a>(<a class="code" href="classripple_1_1SHAMap.html#acbedaf0be7acd2816e01be821fdc4697">ledgerSeq_</a>)</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; -&gt;canonicalize_replace_client(hash.<a class="code" href="classripple_1_1SHAMapHash.html#a8f95b5bc14b7085d368f56aeaa17ef4f">as_uint256</a>(), node);</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;}</div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; </div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01178"></a><span class="lineno"><a class="line" href="classripple_1_1SHAMap.html#a721b11739ad539851737443deeccf96b"> 1178</a></span>&#160;<a class="code" href="classripple_1_1SHAMap.html#a721b11739ad539851737443deeccf96b">SHAMap::invariants</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; (void)<a class="code" href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079">getHash</a>(); <span class="comment">// update node hashes</span></div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; <span class="keyword">auto</span> node = <a class="code" href="classripple_1_1SHAMap.html#a5b5f477358f0d5ce1b24d0888ffefb1d">root_</a>.get();</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; assert(node != <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; assert(!node-&gt;isLeaf());</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/stack.html">SharedPtrNodeStack</a> stack;</div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> leaf = <a class="code" href="classripple_1_1SHAMap.html#aa349ff193020caf2178e28ef6392e675">peekFirstItem</a>(stack); leaf != <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; leaf = <a class="code" href="classripple_1_1SHAMap.html#a5902b212b3da87e522eef58c6c0c83e9">peekNextItem</a>(leaf-&gt;peekItem()-&gt;key(), stack))</div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; ;</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160; node-&gt;invariants(<span class="keyword">true</span>);</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;}</div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; </div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;} <span class="comment">// namespace ripple</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="aclassbeast_1_1Journal_html_a3dfb8e2e3eecccdb5cf78ff21bca069c"><div class="ttname"><a href="classbeast_1_1Journal.html#a3dfb8e2e3eecccdb5cf78ff21bca069c">beast::Journal::fatal</a></div><div class="ttdeci">Stream fatal() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00339">Journal.h:339</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapInnerNode_html_a11f313e4e571af4bd75a5a3f7abeceee"><div class="ttname"><a href="classripple_1_1SHAMapInnerNode.html#a11f313e4e571af4bd75a5a3f7abeceee">ripple::SHAMapInnerNode::isInner</a></div><div class="ttdeci">bool isInner() const override</div><div class="ttdoc">Determines if this is an inner node.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapInnerNode_8h_source.html#l00132">SHAMapInnerNode.h:132</a></div></div>
<div class="ttc" id="anamespaceripple_html_a57d7e7b27df7e719fdf5569f96be60a3ac9d2b0df1bd24ef0d09db1040dceac6b"><div class="ttname"><a href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3ac9d2b0df1bd24ef0d09db1040dceac6b">ripple::hotUNKNOWN</a></div><div class="ttdeci">@ hotUNKNOWN</div><div class="ttdef"><b>Definition:</b> <a href="NodeObject_8h_source.html#l00033">NodeObject.h:33</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a721b11739ad539851737443deeccf96b"><div class="ttname"><a href="classripple_1_1SHAMap.html#a721b11739ad539851737443deeccf96b">ripple::SHAMap::invariants</a></div><div class="ttdeci">void invariants() const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01179">SHAMap.cpp:1179</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a721b11739ad539851737443deeccf96b"><div class="ttname"><a href="classripple_1_1SHAMap.html#a721b11739ad539851737443deeccf96b">ripple::SHAMap::invariants</a></div><div class="ttdeci">void invariants() const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01178">SHAMap.cpp:1178</a></div></div>
<div class="ttc" id="aclassripple_1_1Family_html_a794019ebd9859fb37a7a65b80e8d6df7"><div class="ttname"><a href="classripple_1_1Family.html#a794019ebd9859fb37a7a65b80e8d6df7">ripple::Family::getTreeNodeCache</a></div><div class="ttdeci">virtual std::shared_ptr&lt; TreeNodeCache &gt; getTreeNodeCache(std::uint32_t ledgerSeq)=0</div><div class="ttdoc">Return a pointer to the Family Tree Node Cache.</div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_af8599964238eb94d795606f220654db9"><div class="ttname"><a href="classripple_1_1SHAMap.html#af8599964238eb94d795606f220654db9">ripple::SHAMap::branchFactor</a></div><div class="ttdeci">static constexpr unsigned int branchFactor</div><div class="ttdoc">Number of children each non-leaf node has (the 'radix tree' part of the map)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8h_source.html#l00116">SHAMap.h:116</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_aa3221154f0a1742601dba0160b900ae1"><div class="ttname"><a href="classripple_1_1SHAMap.html#aa3221154f0a1742601dba0160b900ae1">ripple::SHAMap::descendNoStore</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; descendNoStore(std::shared_ptr&lt; SHAMapInnerNode &gt; const &amp;, int branch) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00340">SHAMap.cpp:340</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ripple::ListDisposition::pending</a></div><div class="ttdeci">@ pending</div><div class="ttdoc">List will be valid in the future.</div></div>
<div class="ttc" id="aclassripple_1_1SHAMapInnerNode_html_a816fb1a18b49832dcffccc073a5dd929"><div class="ttname"><a href="classripple_1_1SHAMapInnerNode.html#a816fb1a18b49832dcffccc073a5dd929">ripple::SHAMapInnerNode::setChild</a></div><div class="ttdeci">void setChild(int m, std::shared_ptr&lt; SHAMapTreeNode &gt; const &amp;child)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapInnerNode_8cpp_source.html#l00287">SHAMapInnerNode.cpp:287</a></div></div>
<div class="ttc" id="anamespaceripple_html_aabe37451093c21757855542d68fba3ce"><div class="ttname"><a href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">ripple::makeSlice</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_same&lt; T, char &gt;::value||std::is_same&lt; T, unsigned char &gt;::value, Slice &gt; makeSlice(std::array&lt; T, N &gt; const &amp;a)</div><div class="ttdef"><b>Definition:</b> <a href="Slice_8h_source.html#l00241">Slice.h:241</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapNodeID_html_a23e606ffcd8a863d0f678f040001aedf"><div class="ttname"><a href="classripple_1_1SHAMapNodeID.html#a23e606ffcd8a863d0f678f040001aedf">ripple::SHAMapNodeID::getChildNodeID</a></div><div class="ttdeci">SHAMapNodeID getChildNodeID(unsigned int m) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapNodeID_8cpp_source.html#l00074">SHAMapNodeID.cpp:74</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ac12fd99d7dee738a86015218f6e48433"><div class="ttname"><a href="classripple_1_1SHAMap.html#ac12fd99d7dee738a86015218f6e48433">ripple::SHAMap::SHAMap</a></div><div class="ttdeci">SHAMap(SHAMap const &amp;)=delete</div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a5902b212b3da87e522eef58c6c0c83e9"><div class="ttname"><a href="classripple_1_1SHAMap.html#a5902b212b3da87e522eef58c6c0c83e9">ripple::SHAMap::peekNextItem</a></div><div class="ttdeci">SHAMapLeafNode const * peekNextItem(uint256 const &amp;id, SharedPtrNodeStack &amp;stack) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00557">SHAMap.cpp:557</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapSyncFilter_html_aab30f4bd0cd629af0cb5a7f53afb7fb4"><div class="ttname"><a href="classripple_1_1SHAMapSyncFilter.html#aab30f4bd0cd629af0cb5a7f53afb7fb4">ripple::SHAMapSyncFilter::getNode</a></div><div class="ttdeci">virtual std::optional&lt; Blob &gt; getNode(SHAMapHash const &amp;nodeHash) const =0</div></div>
<div class="ttc" id="ashared_ptr_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a9b0dff3c3bf35efc30104c93becdc079"><div class="ttname"><a href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079">ripple::SHAMap::getHash</a></div><div class="ttdeci">SHAMapHash getHash() const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00843">SHAMap.cpp:843</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a9b0dff3c3bf35efc30104c93becdc079"><div class="ttname"><a href="classripple_1_1SHAMap.html#a9b0dff3c3bf35efc30104c93becdc079">ripple::SHAMap::getHash</a></div><div class="ttdeci">SHAMapHash getHash() const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00842">SHAMap.cpp:842</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a0b1d68d0723680664e14401c86625b9f"><div class="ttname"><a href="classripple_1_1SHAMap.html#a0b1d68d0723680664e14401c86625b9f">ripple::SHAMap::backed_</a></div><div class="ttdeci">bool backed_</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8h_source.html#l00110">SHAMap.h:110</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae0356b1de00f841c554c830be509dd58a603cc9fa7c68a8ccd6d25fbb0dd83248"><div class="ttname"><a href="namespaceripple.html#ae0356b1de00f841c554c830be509dd58a603cc9fa7c68a8ccd6d25fbb0dd83248">ripple::SHAMapNodeType::tnINNER</a></div><div class="ttdeci">@ tnINNER</div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a343edca635d6cf2df19026569be34313"><div class="ttname"><a href="classripple_1_1SHAMap.html#a343edca635d6cf2df19026569be34313">ripple::SHAMap::type_</a></div><div class="ttdeci">const SHAMapType type_</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8h_source.html#l00109">SHAMap.h:109</a></div></div>
@@ -1274,13 +1272,13 @@ $(function() {
<div class="ttc" id="anamespaceripple_html_a179c66641961c1b976e7c050860064a3"><div class="ttname"><a href="namespaceripple.html#a179c66641961c1b976e7c050860064a3">ripple::selectBranch</a></div><div class="ttdeci">unsigned int selectBranch(SHAMapNodeID const &amp;id, uint256 const &amp;hash)</div><div class="ttdoc">Returns the branch that would contain the given hash.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapNodeID_8cpp_source.html#l00121">SHAMapNodeID.cpp:121</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ab69c3b19b1d65ff919f578a610f32a3e"><div class="ttname"><a href="classripple_1_1SHAMap.html#ab69c3b19b1d65ff919f578a610f32a3e">ripple::SHAMap::fetchNodeFromDB</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; fetchNodeFromDB(SHAMapHash const &amp;hash) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00163">SHAMap.cpp:163</a></div></div>
<div class="ttc" id="aclassripple_1_1Serializer_html_a6d7436e5990cb278bd924cef9396df3c"><div class="ttname"><a href="classripple_1_1Serializer.html#a6d7436e5990cb278bd924cef9396df3c">ripple::Serializer::modData</a></div><div class="ttdeci">Blob &amp; modData()</div><div class="ttdef"><b>Definition:</b> <a href="Serializer_8h_source.html#l00178">Serializer.h:178</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ad628222b8fa175537889873ff6724cc0"><div class="ttname"><a href="classripple_1_1SHAMap.html#ad628222b8fa175537889873ff6724cc0">ripple::SHAMap::addItem</a></div><div class="ttdeci">bool addItem(SHAMapNodeType type, SHAMapItem &amp;&amp;i)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00837">SHAMap.cpp:837</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ad628222b8fa175537889873ff6724cc0"><div class="ttname"><a href="classripple_1_1SHAMap.html#ad628222b8fa175537889873ff6724cc0">ripple::SHAMap::addItem</a></div><div class="ttdeci">bool addItem(SHAMapNodeType type, SHAMapItem &amp;&amp;i)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00836">SHAMap.cpp:836</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae0356b1de00f841c554c830be509dd58ab2364e40a67b08ba6170314afc07d07b"><div class="ttname"><a href="namespaceripple.html#ae0356b1de00f841c554c830be509dd58ab2364e40a67b08ba6170314afc07d07b">ripple::SHAMapNodeType::tnACCOUNT_STATE</a></div><div class="ttdeci">@ tnACCOUNT_STATE</div></div>
<div class="ttc" id="apair_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair::first</a></div><div class="ttdeci">T first</div></div>
<div class="ttc" id="anamespaceripple_html_a5d9fe757c37a7602a883d30b14e1bf3cae6bed345f53943469741d7295552fcd4"><div class="ttname"><a href="namespaceripple.html#a5d9fe757c37a7602a883d30b14e1bf3cae6bed345f53943469741d7295552fcd4">ripple::SHAMapType::TRANSACTION</a></div><div class="ttdeci">@ TRANSACTION</div></div>
<div class="ttc" id="aclassripple_1_1SHAMapInnerNode_html_ad1d3440e82f822d85cc57734a16dc524"><div class="ttname"><a href="classripple_1_1SHAMapInnerNode.html#ad1d3440e82f822d85cc57734a16dc524">ripple::SHAMapInnerNode::canonicalizeChild</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; canonicalizeChild(int branch, std::shared_ptr&lt; SHAMapTreeNode &gt; node)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapInnerNode_8cpp_source.html#l00371">SHAMapInnerNode.cpp:371</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a64d84916fb3113b9c855dbdad85cc0c2"><div class="ttname"><a href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">ripple::SHAMap::walkSubTree</a></div><div class="ttdeci">int walkSubTree(bool doWrite, NodeObjectType t)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00990">SHAMap.cpp:990</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a16c47b967da5fd093f51e7331f42c9b6"><div class="ttname"><a href="classripple_1_1SHAMap.html#a16c47b967da5fd093f51e7331f42c9b6">ripple::SHAMap::dump</a></div><div class="ttdeci">void dump(bool withHashes=false) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01115">SHAMap.cpp:1115</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a64d84916fb3113b9c855dbdad85cc0c2"><div class="ttname"><a href="classripple_1_1SHAMap.html#a64d84916fb3113b9c855dbdad85cc0c2">ripple::SHAMap::walkSubTree</a></div><div class="ttdeci">int walkSubTree(bool doWrite, NodeObjectType t)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00989">SHAMap.cpp:989</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a16c47b967da5fd093f51e7331f42c9b6"><div class="ttname"><a href="classripple_1_1SHAMap.html#a16c47b967da5fd093f51e7331f42c9b6">ripple::SHAMap::dump</a></div><div class="ttdeci">void dump(bool withHashes=false) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01114">SHAMap.cpp:1114</a></div></div>
<div class="ttc" id="anamespaceripple_html_a57d7e7b27df7e719fdf5569f96be60a3"><div class="ttname"><a href="namespaceripple.html#a57d7e7b27df7e719fdf5569f96be60a3">ripple::NodeObjectType</a></div><div class="ttdeci">NodeObjectType</div><div class="ttdoc">The types of node objects.</div><div class="ttdef"><b>Definition:</b> <a href="NodeObject_8h_source.html#l00032">NodeObject.h:32</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a944948c4ffd1bdc5767c58e76edc21ea"><div class="ttname"><a href="classripple_1_1SHAMap.html#a944948c4ffd1bdc5767c58e76edc21ea">ripple::SHAMap::onlyBelow</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapItem const &gt; const &amp; onlyBelow(SHAMapTreeNode *) const</div><div class="ttdoc">If there is only one leaf below this node, get its contents.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00507">SHAMap.cpp:507</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae0356b1de00f841c554c830be509dd58"><div class="ttname"><a href="namespaceripple.html#ae0356b1de00f841c554c830be509dd58">ripple::SHAMapNodeType</a></div><div class="ttdeci">SHAMapNodeType</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapTreeNode_8h_source.html#l00046">SHAMapTreeNode.h:46</a></div></div>
@@ -1301,7 +1299,7 @@ $(function() {
<div class="ttc" id="aclassripple_1_1SHAMap_html_ae3639927ea223b4352d9cfe060827944"><div class="ttname"><a href="classripple_1_1SHAMap.html#ae3639927ea223b4352d9cfe060827944">ripple::SHAMap::snapShot</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMap &gt; snapShot(bool isMutable) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00070">SHAMap.cpp:70</a></div></div>
<div class="ttc" id="anamespaceripple_html_a5d9fe757c37a7602a883d30b14e1bf3ca2b848a8cc886d253d21a77c43cd50aae"><div class="ttname"><a href="namespaceripple.html#a5d9fe757c37a7602a883d30b14e1bf3ca2b848a8cc886d253d21a77c43cd50aae">ripple::SHAMapType::STATE</a></div><div class="ttdeci">@ STATE</div></div>
<div class="ttc" id="anamespaceripple_html_aa2ccf44248af5be8a81db7091ad4d019"><div class="ttname"><a href="namespaceripple.html#aa2ccf44248af5be8a81db7091ad4d019">ripple::const_iterator</a></div><div class="ttdeci">Dir::const_iterator const_iterator</div><div class="ttdef"><b>Definition:</b> <a href="Directory_8cpp_source.html#l00024">Directory.cpp:24</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ab39da8aa57430441b1f4fdce7fe6cbfe"><div class="ttname"><a href="classripple_1_1SHAMap.html#ab39da8aa57430441b1f4fdce7fe6cbfe">ripple::SHAMap::cacheLookup</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; cacheLookup(SHAMapHash const &amp;hash) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01158">SHAMap.cpp:1158</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ab39da8aa57430441b1f4fdce7fe6cbfe"><div class="ttname"><a href="classripple_1_1SHAMap.html#ab39da8aa57430441b1f4fdce7fe6cbfe">ripple::SHAMap::cacheLookup</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; cacheLookup(SHAMapHash const &amp;hash) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01157">SHAMap.cpp:1157</a></div></div>
<div class="ttc" id="aclassripple_1_1Family_html_a195ad5c61d5ef6a5b269232ecea7ca55"><div class="ttname"><a href="classripple_1_1Family.html#a195ad5c61d5ef6a5b269232ecea7ca55">ripple::Family::missingNode</a></div><div class="ttdeci">virtual void missingNode(std::uint32_t refNum)=0</div></div>
<div class="ttc" id="aclassripple_1_1Family_html_a2618f6f7bd3709acf853db111c814df2"><div class="ttname"><a href="classripple_1_1Family.html#a2618f6f7bd3709acf853db111c814df2">ripple::Family::db</a></div><div class="ttdeci">virtual NodeStore::Database &amp; db()=0</div></div>
<div class="ttc" id="aclassripple_1_1SHAMapLeafNode_html"><div class="ttname"><a href="classripple_1_1SHAMapLeafNode.html">ripple::SHAMapLeafNode</a></div><div class="ttdef"><b>Definition:</b> <a href="SHAMapLeafNode_8h_source.html#l00032">SHAMapLeafNode.h:32</a></div></div>
@@ -1316,6 +1314,7 @@ $(function() {
<div class="ttc" id="aclassripple_1_1base__uint_html"><div class="ttname"><a href="classripple_1_1base__uint.html">ripple::base_uint&lt; 256 &gt;</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a0a9bf789b31096bb8938b6fc93bac625"><div class="ttname"><a href="classripple_1_1SHAMap.html#a0a9bf789b31096bb8938b6fc93bac625">ripple::SHAMap::hasItem</a></div><div class="ttdeci">bool hasItem(uint256 const &amp;id) const</div><div class="ttdoc">Does the tree have an item with the given ID?</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00684">SHAMap.cpp:684</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapInnerNode_html_a8932a6ff79c447556da4b17e908bd008"><div class="ttname"><a href="classripple_1_1SHAMapInnerNode.html#a8932a6ff79c447556da4b17e908bd008">ripple::SHAMapInnerNode::getChildHash</a></div><div class="ttdeci">SHAMapHash const &amp; getChildHash(int m) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapInnerNode_8cpp_source.html#l00361">SHAMapInnerNode.cpp:361</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapInnerNode_html_a7fb5fc0e5d65ed4c3c77537a8fda8d32"><div class="ttname"><a href="classripple_1_1SHAMapInnerNode.html#a7fb5fc0e5d65ed4c3c77537a8fda8d32">ripple::SHAMapInnerNode::setChild</a></div><div class="ttdeci">void setChild(int m, std::shared_ptr&lt; SHAMapTreeNode &gt; child)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapInnerNode_8cpp_source.html#l00287">SHAMapInnerNode.cpp:287</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapInnerNode_html"><div class="ttname"><a href="classripple_1_1SHAMapInnerNode.html">ripple::SHAMapInnerNode</a></div><div class="ttdef"><b>Definition:</b> <a href="SHAMapInnerNode_8h_source.html#l00041">SHAMapInnerNode.h:41</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_aa349ff193020caf2178e28ef6392e675"><div class="ttname"><a href="classripple_1_1SHAMap.html#aa349ff193020caf2178e28ef6392e675">ripple::SHAMap::peekFirstItem</a></div><div class="ttdeci">SHAMapLeafNode const * peekFirstItem(SharedPtrNodeStack &amp;stack) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00543">SHAMap.cpp:543</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapItem_html"><div class="ttname"><a href="classripple_1_1SHAMapItem.html">ripple::SHAMapItem</a></div><div class="ttdef"><b>Definition:</b> <a href="SHAMapItem_8h_source.html#l00031">SHAMapItem.h:31</a></div></div>
@@ -1333,10 +1332,10 @@ $(function() {
<div class="ttc" id="aclassbeast_1_1Journal_html_a87d6bd59020d94110027dcab3d9e3357"><div class="ttname"><a href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">beast::Journal::info</a></div><div class="ttdeci">Stream info() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00321">Journal.h:321</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a149dff8600718cccd0d5b9e7af9d3c79"><div class="ttname"><a href="classripple_1_1SHAMap.html#a149dff8600718cccd0d5b9e7af9d3c79">ripple::SHAMap::journal_</a></div><div class="ttdeci">beast::Journal journal_</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8h_source.html#l00099">SHAMap.h:99</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapTreeNode_html_a3feaa925a9dc0e847049e6c4cfbb6875"><div class="ttname"><a href="classripple_1_1SHAMapTreeNode.html#a3feaa925a9dc0e847049e6c4cfbb6875">ripple::SHAMapTreeNode::isLeaf</a></div><div class="ttdeci">virtual bool isLeaf() const =0</div><div class="ttdoc">Determines if this is a leaf node.</div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ad0807d9637171e188518d9e453c4e972"><div class="ttname"><a href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972">ripple::SHAMap::canonicalize</a></div><div class="ttdeci">void canonicalize(SHAMapHash const &amp;hash, std::shared_ptr&lt; SHAMapTreeNode &gt; &amp;) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01166">SHAMap.cpp:1166</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ad0807d9637171e188518d9e453c4e972"><div class="ttname"><a href="classripple_1_1SHAMap.html#ad0807d9637171e188518d9e453c4e972">ripple::SHAMap::canonicalize</a></div><div class="ttdeci">void canonicalize(SHAMapHash const &amp;hash, std::shared_ptr&lt; SHAMapTreeNode &gt; &amp;) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l01165">SHAMap.cpp:1165</a></div></div>
<div class="ttc" id="aclassripple_1_1Family_html"><div class="ttname"><a href="classripple_1_1Family.html">ripple::Family</a></div><div class="ttdef"><b>Definition:</b> <a href="Family_8h_source.html#l00032">Family.h:32</a></div></div>
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ad530edc60b33c2eb590d2be1cb12f2de"><div class="ttname"><a href="classripple_1_1SHAMap.html#ad530edc60b33c2eb590d2be1cb12f2de">ripple::SHAMap::fetchRoot</a></div><div class="ttdeci">bool fetchRoot(SHAMapHash const &amp;hash, SHAMapSyncFilter *filter)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00895">SHAMap.cpp:895</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ad530edc60b33c2eb590d2be1cb12f2de"><div class="ttname"><a href="classripple_1_1SHAMap.html#ad530edc60b33c2eb590d2be1cb12f2de">ripple::SHAMap::fetchRoot</a></div><div class="ttdeci">bool fetchRoot(SHAMapHash const &amp;hash, SHAMapSyncFilter *filter)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00894">SHAMap.cpp:894</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapTreeNode_html_a454e86c9ed693f8921d53a915d8b1415"><div class="ttname"><a href="classripple_1_1SHAMapTreeNode.html#a454e86c9ed693f8921d53a915d8b1415">ripple::SHAMapTreeNode::getHash</a></div><div class="ttdeci">SHAMapHash const &amp; getHash() const</div><div class="ttdoc">Return the hash of this node.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapTreeNode_8h_source.html#l00143">SHAMapTreeNode.h:143</a></div></div>
<div class="ttc" id="aclassripple_1_1Serializer_html"><div class="ttname"><a href="classripple_1_1Serializer.html">ripple::Serializer</a></div><div class="ttdef"><b>Definition:</b> <a href="Serializer_8h_source.html#l00039">Serializer.h:39</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapTreeNode_html_a5631e2f77123e3b73229ef4c890ad60f"><div class="ttname"><a href="classripple_1_1SHAMapTreeNode.html#a5631e2f77123e3b73229ef4c890ad60f">ripple::SHAMapTreeNode::makeFromPrefix</a></div><div class="ttdeci">static std::shared_ptr&lt; SHAMapTreeNode &gt; makeFromPrefix(Slice rawNode, SHAMapHash const &amp;hash)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapTreeNode_8cpp_source.html#l00148">SHAMapTreeNode.cpp:148</a></div></div>
@@ -1347,24 +1346,24 @@ $(function() {
<div class="ttc" id="aclassripple_1_1SHAMap_html_a0fa261a41fdf7f773f104e2e01cf8864"><div class="ttname"><a href="classripple_1_1SHAMap.html#a0fa261a41fdf7f773f104e2e01cf8864">ripple::SHAMap::checkFilter</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; checkFilter(SHAMapHash const &amp;hash, SHAMapSyncFilter *filter) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00204">SHAMap.cpp:204</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a36ba184d7125776bff17e081e9e1d7ed"><div class="ttname"><a href="classripple_1_1SHAMap.html#a36ba184d7125776bff17e081e9e1d7ed">ripple::SHAMap::dirtyUp</a></div><div class="ttdeci">void dirtyUp(SharedPtrNodeStack &amp;stack, uint256 const &amp;target, std::shared_ptr&lt; SHAMapTreeNode &gt; terminal)</div><div class="ttdoc">Update hashes up to the root.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00094">SHAMap.cpp:94</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_af6a56124ffdd304fb80e45c9b8ae7e62"><div class="ttname"><a href="classripple_1_1SHAMap.html#af6a56124ffdd304fb80e45c9b8ae7e62">ripple::SHAMap::findKey</a></div><div class="ttdeci">SHAMapLeafNode * findKey(uint256 const &amp;id) const</div><div class="ttdoc">Return nullptr if key not found.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00154">SHAMap.cpp:154</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ab40ce9ae2e8df178c78440b40b6a2cda"><div class="ttname"><a href="classripple_1_1SHAMap.html#ab40ce9ae2e8df178c78440b40b6a2cda">ripple::SHAMap::updateGiveItem</a></div><div class="ttdeci">bool updateGiveItem(SHAMapNodeType type, std::shared_ptr&lt; SHAMapItem const &gt;)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00855">SHAMap.cpp:855</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ab40ce9ae2e8df178c78440b40b6a2cda"><div class="ttname"><a href="classripple_1_1SHAMap.html#ab40ce9ae2e8df178c78440b40b6a2cda">ripple::SHAMap::updateGiveItem</a></div><div class="ttdeci">bool updateGiveItem(SHAMapNodeType type, std::shared_ptr&lt; SHAMapItem const &gt;)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00854">SHAMap.cpp:854</a></div></div>
<div class="ttc" id="anamespaceripple_html_a290b06e05d4261e2042dafbb85f6ccf9"><div class="ttname"><a href="namespaceripple.html#a290b06e05d4261e2042dafbb85f6ccf9">ripple::makeTypedLeaf</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapLeafNode &gt; makeTypedLeaf(SHAMapNodeType type, std::shared_ptr&lt; SHAMapItem const &gt; item, std::uint32_t owner)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00031">SHAMap.cpp:31</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a71caeac6f4a3bce67cc8476a440509c1"><div class="ttname"><a href="classripple_1_1SHAMap.html#a71caeac6f4a3bce67cc8476a440509c1">ripple::SHAMap::end</a></div><div class="ttdeci">const_iterator end() const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8h_source.html#l00744">SHAMap.h:744</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a57c9afd6af077bbca5efc4ee640c7a2d"><div class="ttname"><a href="classripple_1_1SHAMap.html#a57c9afd6af077bbca5efc4ee640c7a2d">ripple::SHAMap::walkTowardsKey</a></div><div class="ttdeci">SHAMapLeafNode * walkTowardsKey(uint256 const &amp;id, SharedPtrNodeStack *stack=nullptr) const</div><div class="ttdoc">Walk towards the specified id, returning the node.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00128">SHAMap.cpp:128</a></div></div>
<div class="ttc" id="anamespaceripple_html_aefd2f77338ce3c9a2fffc4f0b289b483"><div class="ttname"><a href="namespaceripple.html#aefd2f77338ce3c9a2fffc4f0b289b483">ripple::LogicError</a></div><div class="ttdeci">void LogicError(std::string const &amp;how) noexcept</div><div class="ttdoc">Called when faulty logic causes a broken invariant.</div><div class="ttdef"><b>Definition:</b> <a href="contract_8cpp_source.html#l00048">contract.cpp:48</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a9bc9928b273e0467788329faa8f65e96"><div class="ttname"><a href="classripple_1_1SHAMap.html#a9bc9928b273e0467788329faa8f65e96">ripple::SHAMap::addGiveItem</a></div><div class="ttdeci">bool addGiveItem(SHAMapNodeType type, std::shared_ptr&lt; SHAMapItem const &gt; item)</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00768">SHAMap.cpp:768</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_aee5ccc6cf9fa63aa25765227007893fb"><div class="ttname"><a href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb">ripple::SHAMap::unshare</a></div><div class="ttdeci">int unshare()</div><div class="ttdoc">Convert any modified nodes to shared.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00976">SHAMap.cpp:976</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_aee5ccc6cf9fa63aa25765227007893fb"><div class="ttname"><a href="classripple_1_1SHAMap.html#aee5ccc6cf9fa63aa25765227007893fb">ripple::SHAMap::unshare</a></div><div class="ttdeci">int unshare()</div><div class="ttdoc">Convert any modified nodes to shared.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00975">SHAMap.cpp:975</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a07ce8e5379558b4c0e256cbbf2636cb7"><div class="ttname"><a href="classripple_1_1SHAMap.html#a07ce8e5379558b4c0e256cbbf2636cb7">ripple::SHAMap::descendAsync</a></div><div class="ttdeci">SHAMapTreeNode * descendAsync(SHAMapInnerNode *parent, int branch, SHAMapSyncFilter *filter, bool &amp;pending, descendCallback &amp;&amp;) const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00380">SHAMap.cpp:380</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a4756fdd40d2fdb22002ab4d3e25ebde9"><div class="ttname"><a href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">ripple::SHAMap::writeNode</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; writeNode(NodeObjectType t, std::shared_ptr&lt; SHAMapTreeNode &gt; node) const</div><div class="ttdoc">write and canonicalize modified node</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00941">SHAMap.cpp:941</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a4756fdd40d2fdb22002ab4d3e25ebde9"><div class="ttname"><a href="classripple_1_1SHAMap.html#a4756fdd40d2fdb22002ab4d3e25ebde9">ripple::SHAMap::writeNode</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapTreeNode &gt; writeNode(NodeObjectType t, std::shared_ptr&lt; SHAMapTreeNode &gt; node) const</div><div class="ttdoc">write and canonicalize modified node</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00940">SHAMap.cpp:940</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a16961b82bb1c661845b14c88b4e80dc3"><div class="ttname"><a href="classripple_1_1SHAMap.html#a16961b82bb1c661845b14c88b4e80dc3">ripple::SHAMap::leafDepth</a></div><div class="ttdeci">static constexpr unsigned int leafDepth</div><div class="ttdoc">The depth of the hash map: data is only present in the leaves.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8h_source.html#l00120">SHAMap.h:120</a></div></div>
<div class="ttc" id="aempty_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/stack/empty.html">std::stack::empty</a></div><div class="ttdeci">T empty(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_a49003667116eb98c6e966f36e5dd1c77a11efd9ae6f76e706e3f1b34d97584ebc"><div class="ttname"><a href="namespaceripple.html#a49003667116eb98c6e966f36e5dd1c77a11efd9ae6f76e706e3f1b34d97584ebc">ripple::SHAMapState::Immutable</a></div><div class="ttdeci">@ Immutable</div><div class="ttdoc">The map is set in stone and cannot be changed.</div></div>
<div class="ttc" id="apush_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/stack/push.html">std::stack::push</a></div><div class="ttdeci">T push(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_a5d9fe757c37a7602a883d30b14e1bf3c"><div class="ttname"><a href="namespaceripple.html#a5d9fe757c37a7602a883d30b14e1bf3c">ripple::SHAMapType</a></div><div class="ttdeci">SHAMapType</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapMissingNode_8h_source.html#l00032">SHAMapMissingNode.h:32</a></div></div>
<div class="ttc" id="amake_pair_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/pair/make_pair.html">std::make_pair</a></div><div class="ttdeci">T make_pair(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a5afb093086264fa6ce9573d4703e1e85"><div class="ttname"><a href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">ripple::SHAMap::preFlushNode</a></div><div class="ttdeci">std::shared_ptr&lt; Node &gt; preFlushNode(std::shared_ptr&lt; Node &gt; node) const</div><div class="ttdoc">prepare a node to be modified before flushing</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00960">SHAMap.cpp:960</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_a5afb093086264fa6ce9573d4703e1e85"><div class="ttname"><a href="classripple_1_1SHAMap.html#a5afb093086264fa6ce9573d4703e1e85">ripple::SHAMap::preFlushNode</a></div><div class="ttdeci">std::shared_ptr&lt; Node &gt; preFlushNode(std::shared_ptr&lt; Node &gt; node) const</div><div class="ttdoc">prepare a node to be modified before flushing</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00959">SHAMap.cpp:959</a></div></div>
<div class="ttc" id="aclassripple_1_1NodeStore_1_1Database_html_a780601a4dce8d688490a24a61f8cea9e"><div class="ttname"><a href="classripple_1_1NodeStore_1_1Database.html#a780601a4dce8d688490a24a61f8cea9e">ripple::NodeStore::Database::fetchNodeObject</a></div><div class="ttdeci">std::shared_ptr&lt; NodeObject &gt; fetchNodeObject(uint256 const &amp;hash, std::uint32_t ledgerSeq=0, FetchType fetchType=FetchType::synchronous, bool duplicate=false)</div><div class="ttdoc">Fetch a node object.</div><div class="ttdef"><b>Definition:</b> <a href="Database_8cpp_source.html#l00252">Database.cpp:252</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ae6fddc16c43b58e725afde738f4a70a8"><div class="ttname"><a href="classripple_1_1SHAMap.html#ae6fddc16c43b58e725afde738f4a70a8">ripple::SHAMap::flushDirty</a></div><div class="ttdeci">int flushDirty(NodeObjectType t)</div><div class="ttdoc">Flush modified nodes to the nodestore and convert them to shared.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00983">SHAMap.cpp:983</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ae6fddc16c43b58e725afde738f4a70a8"><div class="ttname"><a href="classripple_1_1SHAMap.html#ae6fddc16c43b58e725afde738f4a70a8">ripple::SHAMap::flushDirty</a></div><div class="ttdeci">int flushDirty(NodeObjectType t)</div><div class="ttdoc">Flush modified nodes to the nodestore and convert them to shared.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00982">SHAMap.cpp:982</a></div></div>
<div class="ttc" id="aclassripple_1_1Family_html_af25466995d0a740ffcf80cd8a59cf0c9"><div class="ttname"><a href="classripple_1_1Family.html#af25466995d0a740ffcf80cd8a59cf0c9">ripple::Family::journal</a></div><div class="ttdeci">virtual beast::Journal const &amp; journal()=0</div></div>
<div class="ttc" id="aclassripple_1_1SHAMap_html_ada99838217423830f916a2e194023fd9"><div class="ttname"><a href="classripple_1_1SHAMap.html#ada99838217423830f916a2e194023fd9">ripple::SHAMap::lower_bound</a></div><div class="ttdeci">const_iterator lower_bound(uint256 const &amp;id) const</div><div class="ttdoc">Find the object with the greatest object id smaller than the input id.</div><div class="ttdef"><b>Definition:</b> <a href="SHAMap_8cpp_source.html#l00646">SHAMap.cpp:646</a></div></div>
<div class="ttc" id="aclassripple_1_1SHAMapLeafNode_html_a1b82b561c8fe9afc2a4a281dbb3e833c"><div class="ttname"><a href="classripple_1_1SHAMapLeafNode.html#a1b82b561c8fe9afc2a4a281dbb3e833c">ripple::SHAMapLeafNode::peekItem</a></div><div class="ttdeci">std::shared_ptr&lt; SHAMapItem const &gt; const &amp; peekItem() const</div><div class="ttdef"><b>Definition:</b> <a href="SHAMapLeafNode_8cpp_source.html#l00044">SHAMapLeafNode.cpp:44</a></div></div>