mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-27 06:25:51 +00:00
deploy: 724a301599
This commit is contained in:
@@ -1337,200 +1337,373 @@ $(function() {
|
||||
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  v1.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>() != v2.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>());</div>
|
||||
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> }</div>
|
||||
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  </div>
|
||||
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> <span class="keyword">static</span> <span class="keywordtype">void</span></div>
|
||||
<div class="line"><a name="l01270"></a><span class="lineno"><a class="line" href="namespaceripple.html#af5a98b092dca8d35b8913320f354fb1f"> 1270</a></span> <a class="code" href="namespaceripple.html#af5a98b092dca8d35b8913320f354fb1f">canonicalizeRound</a>(<span class="keywordtype">bool</span> native, <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a>& value, <span class="keywordtype">int</span>& offset)</div>
|
||||
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span> {</div>
|
||||
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  <span class="keywordflow">if</span> (native)</div>
|
||||
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  {</div>
|
||||
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <span class="keywordflow">if</span> (offset < 0)</div>
|
||||
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  {</div>
|
||||
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  <span class="keywordtype">int</span> loops = 0;</div>
|
||||
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  </div>
|
||||
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  <span class="keywordflow">while</span> (offset < -1)</div>
|
||||
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  {</div>
|
||||
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  ++loops;</div>
|
||||
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  }</div>
|
||||
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  </div>
|
||||
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  value += (loops >= 2) ? 9 : 10; <span class="comment">// add before last divide</span></div>
|
||||
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  }</div>
|
||||
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  }</div>
|
||||
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (value > <a class="code" href="classripple_1_1STAmount.html#af88c7b9a2ee49408f4fd17e1ee9f20df">STAmount::cMaxValue</a>)</div>
|
||||
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  {</div>
|
||||
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="keywordflow">while</span> (value > (10 * <a class="code" href="classripple_1_1STAmount.html#af88c7b9a2ee49408f4fd17e1ee9f20df">STAmount::cMaxValue</a>))</div>
|
||||
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  {</div>
|
||||
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  }</div>
|
||||
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> <span class="comment">// This is the legacy version of canonicalizeRound. It's been in use</span></div>
|
||||
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span> <span class="comment">// for years, so it is deeply embedded in the behavior of cross-currency</span></div>
|
||||
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span> <span class="comment">// transactions.</span></div>
|
||||
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span> <span class="comment">// However in 2022 it was noticed that the rounding characteristics were</span></div>
|
||||
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span> <span class="comment">// surprising. When the code converts from IOU-like to XRP-like there may</span></div>
|
||||
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span> <span class="comment">// be a fraction of the IOU-like representation that is too small to be</span></div>
|
||||
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span> <span class="comment">// represented in drops. `canonicalizeRound()` currently does some unusual</span></div>
|
||||
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> <span class="comment">// rounding.</span></div>
|
||||
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span> <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span> <span class="comment">// 1. If the fractional part is greater than or equal to 0.1, then the</span></div>
|
||||
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> <span class="comment">// number of drops is rounded up.</span></div>
|
||||
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span> <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span> <span class="comment">// 2. However, if the fractional part is less than 0.1 (for example,</span></div>
|
||||
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span> <span class="comment">// 0.099999), then the number of drops is rounded down.</span></div>
|
||||
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span> <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> <span class="comment">// The XRP Ledger has this rounding behavior baked in. But there are</span></div>
|
||||
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> <span class="comment">// situations where this rounding behavior led to undesirable outcomes.</span></div>
|
||||
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> <span class="comment">// So an alternative rounding approach was introduced. You'll see that</span></div>
|
||||
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> <span class="comment">// alternative below.</span></div>
|
||||
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> <span class="keyword">static</span> <span class="keywordtype">void</span></div>
|
||||
<div class="line"><a name="l01290"></a><span class="lineno"><a class="line" href="namespaceripple.html#afed19a57936c35db382a67f1d58b6884"> 1290</a></span> <a class="code" href="namespaceripple.html#afed19a57936c35db382a67f1d58b6884">canonicalizeRound</a>(<span class="keywordtype">bool</span> native, <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a>& value, <span class="keywordtype">int</span>& offset, <span class="keywordtype">bool</span>)</div>
|
||||
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> {</div>
|
||||
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="keywordflow">if</span> (native)</div>
|
||||
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  {</div>
|
||||
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <span class="keywordflow">if</span> (offset < 0)</div>
|
||||
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  {</div>
|
||||
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  <span class="keywordtype">int</span> loops = 0;</div>
|
||||
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  </div>
|
||||
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  value += 9; <span class="comment">// add before last divide</span></div>
|
||||
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  }</div>
|
||||
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> }</div>
|
||||
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  </div>
|
||||
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span> STAmount</div>
|
||||
<div class="line"><a name="l01305"></a><span class="lineno"><a class="line" href="namespaceripple.html#a7806e73f2a04df365821602cfcf89ff2"> 1305</a></span> <a class="code" href="namespaceripple.html#a7806e73f2a04df365821602cfcf89ff2">mulRound</a>(</div>
|
||||
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v1,</div>
|
||||
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v2,</div>
|
||||
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> {</div>
|
||||
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="keywordflow">if</span> (v1 == beast::zero || v2 == beast::zero)</div>
|
||||
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <span class="keywordflow">return</span> {issue};</div>
|
||||
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  </div>
|
||||
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  <span class="keywordtype">bool</span> <span class="keyword">const</span> xrp = <a class="code" href="namespaceripple.html#a20d30277b9c78756b3d14493055a307c">isXRP</a>(issue);</div>
|
||||
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  </div>
|
||||
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <span class="keywordflow">if</span> (v1.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>() && v2.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>() && xrp)</div>
|
||||
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  {</div>
|
||||
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> minV =</div>
|
||||
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  (<a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1) < <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2)) ? <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1) : <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2);</div>
|
||||
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> maxV =</div>
|
||||
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  (<a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1) < <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2)) ? <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2) : <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1);</div>
|
||||
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  </div>
|
||||
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keywordflow">if</span> (minV > 3000000000ull) <span class="comment">// sqrt(cMaxNative)</span></div>
|
||||
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  Throw<std::runtime_error>(<span class="stringliteral">"Native value overflow"</span>);</div>
|
||||
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  </div>
|
||||
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  <span class="keywordflow">if</span> (((maxV >> 32) * minV) > 2095475792ull) <span class="comment">// cMaxNative / 2^32</span></div>
|
||||
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  Throw<std::runtime_error>(<span class="stringliteral">"Native value overflow"</span>);</div>
|
||||
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  </div>
|
||||
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(v1.<a class="code" href="classripple_1_1STBase.html#a48097bca334d2f32a1d7861b59ae2e30">getFName</a>(), minV * maxV);</div>
|
||||
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  }</div>
|
||||
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  </div>
|
||||
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> value1 = v1.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>(), value2 = v2.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>();</div>
|
||||
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  <span class="keywordtype">int</span> offset1 = v1.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>(), offset2 = v2.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>();</div>
|
||||
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  </div>
|
||||
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="keywordflow">if</span> (v1.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  <span class="keywordflow">while</span> (offset < -1)</div>
|
||||
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  {</div>
|
||||
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  ++loops;</div>
|
||||
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  }</div>
|
||||
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  </div>
|
||||
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  value += (loops >= 2) ? 9 : 10; <span class="comment">// add before last divide</span></div>
|
||||
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  }</div>
|
||||
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  }</div>
|
||||
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (value > <a class="code" href="classripple_1_1STAmount.html#af88c7b9a2ee49408f4fd17e1ee9f20df">STAmount::cMaxValue</a>)</div>
|
||||
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  {</div>
|
||||
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <span class="keywordflow">while</span> (value > (10 * <a class="code" href="classripple_1_1STAmount.html#af88c7b9a2ee49408f4fd17e1ee9f20df">STAmount::cMaxValue</a>))</div>
|
||||
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  {</div>
|
||||
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  }</div>
|
||||
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  </div>
|
||||
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  value += 9; <span class="comment">// add before last divide</span></div>
|
||||
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  }</div>
|
||||
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span> }</div>
|
||||
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  </div>
|
||||
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> <span class="comment">// The original canonicalizeRound did not allow the rounding direction to</span></div>
|
||||
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span> <span class="comment">// be specified. It also ignored some of the bits that could contribute to</span></div>
|
||||
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span> <span class="comment">// rounding decisions. canonicalizeRoundStrict() tracks all of the bits in</span></div>
|
||||
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span> <span class="comment">// the value being rounded.</span></div>
|
||||
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span> <span class="keyword">static</span> <span class="keywordtype">void</span></div>
|
||||
<div class="line"><a name="l01329"></a><span class="lineno"><a class="line" href="namespaceripple.html#a07a687e3a16e605ec3b4ecfd29bb6232"> 1329</a></span> <a class="code" href="namespaceripple.html#a07a687e3a16e605ec3b4ecfd29bb6232">canonicalizeRoundStrict</a>(</div>
|
||||
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  <span class="keywordtype">bool</span> native,</div>
|
||||
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a>& value,</div>
|
||||
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <span class="keywordtype">int</span>& offset,</div>
|
||||
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span> {</div>
|
||||
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="keywordflow">if</span> (native)</div>
|
||||
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  {</div>
|
||||
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="keywordflow">while</span> (value1 < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="keywordflow">if</span> (offset < 0)</div>
|
||||
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  {</div>
|
||||
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  value1 *= 10;</div>
|
||||
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  --offset1;</div>
|
||||
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  }</div>
|
||||
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  }</div>
|
||||
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  </div>
|
||||
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  <span class="keywordflow">if</span> (v2.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  {</div>
|
||||
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <span class="keywordflow">while</span> (value2 < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  {</div>
|
||||
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  value2 *= 10;</div>
|
||||
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  --offset2;</div>
|
||||
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  }</div>
|
||||
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  }</div>
|
||||
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  </div>
|
||||
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="keywordtype">bool</span> <span class="keyword">const</span> resultNegative = v1.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>() != v2.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>();</div>
|
||||
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  </div>
|
||||
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="comment">// We multiply the two mantissas (each is between 10^15</span></div>
|
||||
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <span class="comment">// and 10^16), so their product is in the 10^30 to 10^32</span></div>
|
||||
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="comment">// range. Dividing their product by 10^14 maintains the</span></div>
|
||||
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  <span class="comment">// precision, by scaling the result to 10^16 to 10^18.</span></div>
|
||||
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="comment">// If the we're rounding up, we want to round up away</span></div>
|
||||
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  <span class="comment">// from zero, and if we're rounding down, truncation</span></div>
|
||||
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  <span class="comment">// is implicit.</span></div>
|
||||
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> amount = <a class="code" href="namespaceripple.html#ae745102449603924823f094157604641">muldiv_round</a>(</div>
|
||||
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  value1, value2, <a class="code" href="namespaceripple.html#a1b237be5c5c7faa68434cdf539f3120a">tenTo14</a>, (resultNegative != roundUp) ? <a class="code" href="namespaceripple.html#a4e2d5fc0ab98ac97423905610e7c20e5">tenTo14m1</a> : 0);</div>
|
||||
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  </div>
|
||||
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  <span class="keywordtype">int</span> offset = offset1 + offset2 + 14;</div>
|
||||
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="keywordflow">if</span> (resultNegative != roundUp)</div>
|
||||
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <a class="code" href="namespaceripple.html#af5a98b092dca8d35b8913320f354fb1f">canonicalizeRound</a>(xrp, amount, offset);</div>
|
||||
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> result(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  </div>
|
||||
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <span class="keywordflow">if</span> (roundUp && !resultNegative && !result)</div>
|
||||
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  {</div>
|
||||
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <span class="keywordflow">if</span> (xrp)</div>
|
||||
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  {</div>
|
||||
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  amount = 1;</div>
|
||||
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  offset = 0;</div>
|
||||
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  }</div>
|
||||
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  {</div>
|
||||
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  amount = <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>;</div>
|
||||
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  offset = <a class="code" href="classripple_1_1STAmount.html#ade4056a07e14fcd243fd2609eedba34d">STAmount::cMinOffset</a>;</div>
|
||||
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  }</div>
|
||||
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  }</div>
|
||||
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  <span class="keywordflow">return</span> result;</div>
|
||||
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> }</div>
|
||||
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  </div>
|
||||
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> STAmount</div>
|
||||
<div class="line"><a name="l01391"></a><span class="lineno"><a class="line" href="namespaceripple.html#a47b15adfd6fb69767c64f50d860a11cc"> 1391</a></span> <a class="code" href="namespaceripple.html#a47b15adfd6fb69767c64f50d860a11cc">divRound</a>(</div>
|
||||
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& num,</div>
|
||||
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& den,</div>
|
||||
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> {</div>
|
||||
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="keywordflow">if</span> (den == beast::zero)</div>
|
||||
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  Throw<std::runtime_error>(<span class="stringliteral">"division by zero"</span>);</div>
|
||||
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  </div>
|
||||
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  <span class="keywordflow">if</span> (num == beast::zero)</div>
|
||||
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <span class="keywordflow">return</span> {issue};</div>
|
||||
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  <span class="keywordtype">bool</span> hadRemainder = <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  </div>
|
||||
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordflow">while</span> (offset < -1)</div>
|
||||
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  {</div>
|
||||
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="comment">// It would be better to use std::lldiv than to separately</span></div>
|
||||
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  <span class="comment">// compute the remainder. But std::lldiv does not support</span></div>
|
||||
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  <span class="comment">// unsigned arguments.</span></div>
|
||||
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> <span class="keyword">const</span> newValue = value / 10;</div>
|
||||
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  hadRemainder |= (value != (newValue * 10));</div>
|
||||
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  value = newValue;</div>
|
||||
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  }</div>
|
||||
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  value +=</div>
|
||||
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  (hadRemainder && roundUp) ? 10 : 9; <span class="comment">// Add before last divide</span></div>
|
||||
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  }</div>
|
||||
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  }</div>
|
||||
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (value > <a class="code" href="classripple_1_1STAmount.html#af88c7b9a2ee49408f4fd17e1ee9f20df">STAmount::cMaxValue</a>)</div>
|
||||
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  {</div>
|
||||
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  <span class="keywordflow">while</span> (value > (10 * <a class="code" href="classripple_1_1STAmount.html#af88c7b9a2ee49408f4fd17e1ee9f20df">STAmount::cMaxValue</a>))</div>
|
||||
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  {</div>
|
||||
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  }</div>
|
||||
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  value += 9; <span class="comment">// add before last divide</span></div>
|
||||
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  value /= 10;</div>
|
||||
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  ++offset;</div>
|
||||
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  }</div>
|
||||
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> }</div>
|
||||
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  </div>
|
||||
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span> <span class="keyword">namespace </span>{</div>
|
||||
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  </div>
|
||||
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span> <span class="comment">// saveNumberRoundMode doesn't do quite enough for us. What we want is a</span></div>
|
||||
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span> <span class="comment">// Number::RoundModeGuard that sets the new mode and restores the old mode</span></div>
|
||||
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span> <span class="comment">// when it leaves scope. Since Number doesn't have that facility, we'll</span></div>
|
||||
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span> <span class="comment">// build it here.</span></div>
|
||||
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span> <span class="keyword">class </span>NumberRoundModeGuard</div>
|
||||
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> {</div>
|
||||
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  saveNumberRoundMode saved_;</div>
|
||||
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  </div>
|
||||
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span> <span class="keyword">public</span>:</div>
|
||||
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <span class="keyword">explicit</span> NumberRoundModeGuard(<a class="code" href="classripple_1_1Number.html#a33e3d8e7a95979bd1eb22c59703c8534">Number::rounding_mode</a> mode) noexcept</div>
|
||||
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  : saved_{<a class="code" href="classripple_1_1Number.html#a9f2a0df7ad0f278908643927a19592f2">Number::setround</a>(mode)}</div>
|
||||
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  {</div>
|
||||
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  }</div>
|
||||
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  </div>
|
||||
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  NumberRoundModeGuard(NumberRoundModeGuard <span class="keyword">const</span>&) = <span class="keyword">delete</span>;</div>
|
||||
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  </div>
|
||||
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  NumberRoundModeGuard&</div>
|
||||
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  operator=(NumberRoundModeGuard <span class="keyword">const</span>&) = <span class="keyword">delete</span>;</div>
|
||||
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> };</div>
|
||||
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  </div>
|
||||
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span> <span class="comment">// We need a class that has an interface similar to NumberRoundModeGuard</span></div>
|
||||
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span> <span class="comment">// but does nothing.</span></div>
|
||||
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> <span class="keyword">class </span>DontAffectNumberRoundMode</div>
|
||||
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span> {</div>
|
||||
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> <span class="keyword">public</span>:</div>
|
||||
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="keyword">explicit</span> DontAffectNumberRoundMode(<a class="code" href="classripple_1_1Number.html#a33e3d8e7a95979bd1eb22c59703c8534">Number::rounding_mode</a> mode) noexcept</div>
|
||||
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  {</div>
|
||||
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  }</div>
|
||||
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  </div>
|
||||
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  DontAffectNumberRoundMode(DontAffectNumberRoundMode <span class="keyword">const</span>&) = <span class="keyword">delete</span>;</div>
|
||||
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  </div>
|
||||
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> numVal = num.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>(), denVal = den.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>();</div>
|
||||
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  <span class="keywordtype">int</span> numOffset = num.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>(), denOffset = den.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>();</div>
|
||||
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  </div>
|
||||
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <span class="keywordflow">if</span> (num.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  {</div>
|
||||
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  <span class="keywordflow">while</span> (numVal < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  {</div>
|
||||
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  numVal *= 10;</div>
|
||||
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  --numOffset;</div>
|
||||
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  }</div>
|
||||
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  }</div>
|
||||
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  </div>
|
||||
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  <span class="keywordflow">if</span> (den.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  {</div>
|
||||
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <span class="keywordflow">while</span> (denVal < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  {</div>
|
||||
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  denVal *= 10;</div>
|
||||
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  --denOffset;</div>
|
||||
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  }</div>
|
||||
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  }</div>
|
||||
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  </div>
|
||||
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  <span class="keywordtype">bool</span> <span class="keyword">const</span> resultNegative = (num.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>() != den.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>());</div>
|
||||
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  DontAffectNumberRoundMode&</div>
|
||||
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  operator=(DontAffectNumberRoundMode <span class="keyword">const</span>&) = <span class="keyword">delete</span>;</div>
|
||||
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span> };</div>
|
||||
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  </div>
|
||||
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> } <span class="comment">// anonymous namespace</span></div>
|
||||
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  </div>
|
||||
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span> <span class="comment">// Pass the canonicalizeRound function pointer as a template parameter.</span></div>
|
||||
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span> <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span> <span class="comment">// We might need to use NumberRoundModeGuard. Allow the caller</span></div>
|
||||
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span> <span class="comment">// to pass either that or a replacement as a template parameter.</span></div>
|
||||
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span> <span class="keyword">template</span> <</div>
|
||||
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  void (*CanonicalizeFunc)(bool, <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a>&, <span class="keywordtype">int</span>&, bool),</div>
|
||||
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  <span class="keyword">typename</span> MightSaveRound></div>
|
||||
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> <span class="keyword">static</span> STAmount</div>
|
||||
<div class="line"><a name="l01417"></a><span class="lineno"><a class="line" href="namespaceripple.html#a66208551f9f42710e224cee24b7ba206"> 1417</a></span> <a class="code" href="namespaceripple.html#a66208551f9f42710e224cee24b7ba206">mulRoundImpl</a>(</div>
|
||||
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v1,</div>
|
||||
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v2,</div>
|
||||
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span> {</div>
|
||||
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <span class="keywordflow">if</span> (v1 == beast::zero || v2 == beast::zero)</div>
|
||||
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  <span class="keywordflow">return</span> {issue};</div>
|
||||
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  </div>
|
||||
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="comment">// We divide the two mantissas (each is between 10^15</span></div>
|
||||
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  <span class="comment">// and 10^16). To maintain precision, we multiply the</span></div>
|
||||
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="comment">// numerator by 10^17 (the product is in the range of</span></div>
|
||||
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  <span class="comment">// 10^32 to 10^33) followed by a division, so the result</span></div>
|
||||
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  <span class="comment">// is in the range of 10^16 to 10^15.</span></div>
|
||||
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <span class="comment">// We round away from zero if we're rounding up or</span></div>
|
||||
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="comment">// truncate if we're rounding down.</span></div>
|
||||
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> amount = <a class="code" href="namespaceripple.html#ae745102449603924823f094157604641">muldiv_round</a>(</div>
|
||||
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  numVal, <a class="code" href="namespaceripple.html#abc2f04db8f54f17ec5d0268d566b7a4d">tenTo17</a>, denVal, (resultNegative != roundUp) ? denVal - 1 : 0);</div>
|
||||
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  </div>
|
||||
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  <span class="keywordtype">int</span> offset = numOffset - denOffset - 17;</div>
|
||||
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  </div>
|
||||
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <span class="keywordflow">if</span> (resultNegative != roundUp)</div>
|
||||
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  <a class="code" href="namespaceripple.html#af5a98b092dca8d35b8913320f354fb1f">canonicalizeRound</a>(<a class="code" href="namespaceripple.html#a20d30277b9c78756b3d14493055a307c">isXRP</a>(issue), amount, offset);</div>
|
||||
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  </div>
|
||||
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> result(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="keywordflow">if</span> (roundUp && !resultNegative && !result)</div>
|
||||
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  {</div>
|
||||
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a20d30277b9c78756b3d14493055a307c">isXRP</a>(issue))</div>
|
||||
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  {</div>
|
||||
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  amount = 1;</div>
|
||||
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  offset = 0;</div>
|
||||
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  }</div>
|
||||
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  {</div>
|
||||
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  amount = <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>;</div>
|
||||
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  offset = <a class="code" href="classripple_1_1STAmount.html#ade4056a07e14fcd243fd2609eedba34d">STAmount::cMinOffset</a>;</div>
|
||||
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  }</div>
|
||||
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  }</div>
|
||||
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  <span class="keywordflow">return</span> result;</div>
|
||||
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span> }</div>
|
||||
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  </div>
|
||||
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span> } <span class="comment">// namespace ripple</span></div>
|
||||
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="keywordtype">bool</span> <span class="keyword">const</span> xrp = <a class="code" href="namespaceripple.html#a20d30277b9c78756b3d14493055a307c">isXRP</a>(issue);</div>
|
||||
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  </div>
|
||||
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keywordflow">if</span> (v1.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>() && v2.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>() && xrp)</div>
|
||||
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  {</div>
|
||||
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> minV =</div>
|
||||
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  (<a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1) < <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2)) ? <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1) : <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2);</div>
|
||||
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> maxV =</div>
|
||||
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  (<a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1) < <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2)) ? <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v2) : <a class="code" href="namespaceripple.html#a82a40c2d1b4a954d5626d74423af9c4c">getSNValue</a>(v1);</div>
|
||||
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  </div>
|
||||
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="keywordflow">if</span> (minV > 3000000000ull) <span class="comment">// sqrt(cMaxNative)</span></div>
|
||||
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  Throw<std::runtime_error>(<span class="stringliteral">"Native value overflow"</span>);</div>
|
||||
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  </div>
|
||||
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <span class="keywordflow">if</span> (((maxV >> 32) * minV) > 2095475792ull) <span class="comment">// cMaxNative / 2^32</span></div>
|
||||
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  Throw<std::runtime_error>(<span class="stringliteral">"Native value overflow"</span>);</div>
|
||||
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  </div>
|
||||
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(v1.<a class="code" href="classripple_1_1STBase.html#a48097bca334d2f32a1d7861b59ae2e30">getFName</a>(), minV * maxV);</div>
|
||||
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  }</div>
|
||||
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  </div>
|
||||
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> value1 = v1.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>(), value2 = v2.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>();</div>
|
||||
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordtype">int</span> offset1 = v1.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>(), offset2 = v2.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>();</div>
|
||||
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  </div>
|
||||
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="keywordflow">if</span> (v1.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  {</div>
|
||||
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  <span class="keywordflow">while</span> (value1 < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  {</div>
|
||||
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  value1 *= 10;</div>
|
||||
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  --offset1;</div>
|
||||
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  }</div>
|
||||
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  }</div>
|
||||
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  </div>
|
||||
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordflow">if</span> (v2.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  {</div>
|
||||
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  <span class="keywordflow">while</span> (value2 < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  {</div>
|
||||
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  value2 *= 10;</div>
|
||||
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  --offset2;</div>
|
||||
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  }</div>
|
||||
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  }</div>
|
||||
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  </div>
|
||||
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  <span class="keywordtype">bool</span> <span class="keyword">const</span> resultNegative = v1.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>() != v2.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>();</div>
|
||||
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>  </div>
|
||||
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>  <span class="comment">// We multiply the two mantissas (each is between 10^15</span></div>
|
||||
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <span class="comment">// and 10^16), so their product is in the 10^30 to 10^32</span></div>
|
||||
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="comment">// range. Dividing their product by 10^14 maintains the</span></div>
|
||||
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="comment">// precision, by scaling the result to 10^16 to 10^18.</span></div>
|
||||
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  <span class="comment">// If the we're rounding up, we want to round up away</span></div>
|
||||
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  <span class="comment">// from zero, and if we're rounding down, truncation</span></div>
|
||||
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  <span class="comment">// is implicit.</span></div>
|
||||
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> amount = <a class="code" href="namespaceripple.html#ae745102449603924823f094157604641">muldiv_round</a>(</div>
|
||||
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  value1, value2, <a class="code" href="namespaceripple.html#a1b237be5c5c7faa68434cdf539f3120a">tenTo14</a>, (resultNegative != roundUp) ? <a class="code" href="namespaceripple.html#a4e2d5fc0ab98ac97423905610e7c20e5">tenTo14m1</a> : 0);</div>
|
||||
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  </div>
|
||||
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  <span class="keywordtype">int</span> offset = offset1 + offset2 + 14;</div>
|
||||
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <span class="keywordflow">if</span> (resultNegative != roundUp)</div>
|
||||
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  {</div>
|
||||
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  CanonicalizeFunc(xrp, amount, offset, roundUp);</div>
|
||||
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  }</div>
|
||||
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> result = [&]() {</div>
|
||||
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  <span class="comment">// If appropriate, tell Number to round down. This gives the desired</span></div>
|
||||
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  <span class="comment">// result from STAmount::canonicalize.</span></div>
|
||||
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  MightSaveRound <span class="keyword">const</span> savedRound(<a class="code" href="classripple_1_1Number.html#a33e3d8e7a95979bd1eb22c59703c8534afed3119e1980867324d399f42cbf548d">Number::towards_zero</a>);</div>
|
||||
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  }();</div>
|
||||
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  </div>
|
||||
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  <span class="keywordflow">if</span> (roundUp && !resultNegative && !result)</div>
|
||||
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  {</div>
|
||||
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  <span class="keywordflow">if</span> (xrp)</div>
|
||||
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  {</div>
|
||||
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  amount = 1;</div>
|
||||
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  offset = 0;</div>
|
||||
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  }</div>
|
||||
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  {</div>
|
||||
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  amount = <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>;</div>
|
||||
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  offset = <a class="code" href="classripple_1_1STAmount.html#ade4056a07e14fcd243fd2609eedba34d">STAmount::cMinOffset</a>;</div>
|
||||
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  }</div>
|
||||
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  }</div>
|
||||
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="keywordflow">return</span> result;</div>
|
||||
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span> }</div>
|
||||
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  </div>
|
||||
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span> STAmount</div>
|
||||
<div class="line"><a name="l01510"></a><span class="lineno"><a class="line" href="namespaceripple.html#a7806e73f2a04df365821602cfcf89ff2"> 1510</a></span> <a class="code" href="namespaceripple.html#a7806e73f2a04df365821602cfcf89ff2">mulRound</a>(</div>
|
||||
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v1,</div>
|
||||
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v2,</div>
|
||||
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> {</div>
|
||||
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  <span class="keywordflow">return</span> mulRoundImpl<canonicalizeRound, DontAffectNumberRoundMode>(</div>
|
||||
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  v1, v2, issue, roundUp);</div>
|
||||
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> }</div>
|
||||
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  </div>
|
||||
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> STAmount</div>
|
||||
<div class="line"><a name="l01521"></a><span class="lineno"><a class="line" href="namespaceripple.html#ab5dd5d90c482d9f8a2549b7dd3863b8b"> 1521</a></span> <a class="code" href="namespaceripple.html#ab5dd5d90c482d9f8a2549b7dd3863b8b">mulRoundStrict</a>(</div>
|
||||
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v1,</div>
|
||||
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& v2,</div>
|
||||
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span> {</div>
|
||||
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  <span class="keywordflow">return</span> mulRoundImpl<canonicalizeRoundStrict, NumberRoundModeGuard>(</div>
|
||||
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  v1, v2, issue, roundUp);</div>
|
||||
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> }</div>
|
||||
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  </div>
|
||||
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> <span class="comment">// We might need to use NumberRoundModeGuard. Allow the caller</span></div>
|
||||
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> <span class="comment">// to pass either that or a replacement as a template parameter.</span></div>
|
||||
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> <span class="keyword">template</span> <<span class="keyword">typename</span> MightSaveRound></div>
|
||||
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> <span class="keyword">static</span> STAmount</div>
|
||||
<div class="line"><a name="l01535"></a><span class="lineno"><a class="line" href="namespaceripple.html#aa2e515ce9112a60a7d65f0829d0efadf"> 1535</a></span> <a class="code" href="namespaceripple.html#aa2e515ce9112a60a7d65f0829d0efadf">divRoundImpl</a>(</div>
|
||||
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& num,</div>
|
||||
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& den,</div>
|
||||
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> {</div>
|
||||
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  <span class="keywordflow">if</span> (den == beast::zero)</div>
|
||||
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  Throw<std::runtime_error>(<span class="stringliteral">"division by zero"</span>);</div>
|
||||
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  </div>
|
||||
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  <span class="keywordflow">if</span> (num == beast::zero)</div>
|
||||
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  <span class="keywordflow">return</span> {issue};</div>
|
||||
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  </div>
|
||||
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> numVal = num.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>(), denVal = den.<a class="code" href="classripple_1_1STAmount.html#ae7f9ce5e872fd96b92b0cedbf8f09f81">mantissa</a>();</div>
|
||||
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keywordtype">int</span> numOffset = num.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>(), denOffset = den.<a class="code" href="classripple_1_1STAmount.html#a2885d73708e1b809f31a46ffaea5ad7f">exponent</a>();</div>
|
||||
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  </div>
|
||||
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  <span class="keywordflow">if</span> (num.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  {</div>
|
||||
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  <span class="keywordflow">while</span> (numVal < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  {</div>
|
||||
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  numVal *= 10;</div>
|
||||
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  --numOffset;</div>
|
||||
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>  }</div>
|
||||
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  }</div>
|
||||
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>  </div>
|
||||
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  <span class="keywordflow">if</span> (den.<a class="code" href="classripple_1_1STAmount.html#af3a02d7e9cd0b11509a90e0e6980bd64">native</a>())</div>
|
||||
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  {</div>
|
||||
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  <span class="keywordflow">while</span> (denVal < <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>)</div>
|
||||
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  {</div>
|
||||
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  denVal *= 10;</div>
|
||||
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  --denOffset;</div>
|
||||
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  }</div>
|
||||
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  }</div>
|
||||
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  </div>
|
||||
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  <span class="keywordtype">bool</span> <span class="keyword">const</span> resultNegative = (num.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>() != den.<a class="code" href="classripple_1_1STAmount.html#aa830654962840253139aa891659f7551">negative</a>());</div>
|
||||
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  </div>
|
||||
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  <span class="comment">// We divide the two mantissas (each is between 10^15</span></div>
|
||||
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>  <span class="comment">// and 10^16). To maintain precision, we multiply the</span></div>
|
||||
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  <span class="comment">// numerator by 10^17 (the product is in the range of</span></div>
|
||||
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  <span class="comment">// 10^32 to 10^33) followed by a division, so the result</span></div>
|
||||
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  <span class="comment">// is in the range of 10^16 to 10^15.</span></div>
|
||||
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  <span class="comment">// We round away from zero if we're rounding up or</span></div>
|
||||
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  <span class="comment">// truncate if we're rounding down.</span></div>
|
||||
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> amount = <a class="code" href="namespaceripple.html#ae745102449603924823f094157604641">muldiv_round</a>(</div>
|
||||
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  numVal, <a class="code" href="namespaceripple.html#abc2f04db8f54f17ec5d0268d566b7a4d">tenTo17</a>, denVal, (resultNegative != roundUp) ? denVal - 1 : 0);</div>
|
||||
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  </div>
|
||||
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  <span class="keywordtype">int</span> offset = numOffset - denOffset - 17;</div>
|
||||
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  </div>
|
||||
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  <span class="keywordflow">if</span> (resultNegative != roundUp)</div>
|
||||
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  <a class="code" href="namespaceripple.html#afed19a57936c35db382a67f1d58b6884">canonicalizeRound</a>(<a class="code" href="namespaceripple.html#a20d30277b9c78756b3d14493055a307c">isXRP</a>(issue), amount, offset, roundUp);</div>
|
||||
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  </div>
|
||||
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> result = [&]() {</div>
|
||||
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  <span class="comment">// If appropriate, tell Number the rounding mode we are using.</span></div>
|
||||
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  <span class="comment">// Note that "roundUp == true" actually means "round away from zero".</span></div>
|
||||
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  <span class="comment">// Otherwise round toward zero.</span></div>
|
||||
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <span class="keyword">using</span> <span class="keyword">enum</span> <a class="code" href="classripple_1_1Number.html#a33e3d8e7a95979bd1eb22c59703c8534">Number::rounding_mode</a>;</div>
|
||||
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  MightSaveRound <span class="keyword">const</span> savedRound(</div>
|
||||
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  roundUp ^ resultNegative ? upward : downward);</div>
|
||||
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  }();</div>
|
||||
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  </div>
|
||||
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="keywordflow">if</span> (roundUp && !resultNegative && !result)</div>
|
||||
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  {</div>
|
||||
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a20d30277b9c78756b3d14493055a307c">isXRP</a>(issue))</div>
|
||||
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  {</div>
|
||||
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  amount = 1;</div>
|
||||
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  offset = 0;</div>
|
||||
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  }</div>
|
||||
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  {</div>
|
||||
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="comment">// return the smallest value above zero</span></div>
|
||||
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  amount = <a class="code" href="classripple_1_1STAmount.html#ad845bc67616b999387da6badf56f7290">STAmount::cMinValue</a>;</div>
|
||||
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  offset = <a class="code" href="classripple_1_1STAmount.html#ade4056a07e14fcd243fd2609eedba34d">STAmount::cMinOffset</a>;</div>
|
||||
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  }</div>
|
||||
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1STAmount.html">STAmount</a>(issue, amount, offset, resultNegative);</div>
|
||||
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  }</div>
|
||||
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  <span class="keywordflow">return</span> result;</div>
|
||||
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span> }</div>
|
||||
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  </div>
|
||||
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span> STAmount</div>
|
||||
<div class="line"><a name="l01616"></a><span class="lineno"><a class="line" href="namespaceripple.html#a47b15adfd6fb69767c64f50d860a11cc"> 1616</a></span> <a class="code" href="namespaceripple.html#a47b15adfd6fb69767c64f50d860a11cc">divRound</a>(</div>
|
||||
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& num,</div>
|
||||
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& den,</div>
|
||||
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> {</div>
|
||||
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="keywordflow">return</span> divRoundImpl<DontAffectNumberRoundMode>(num, den, issue, roundUp);</div>
|
||||
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span> }</div>
|
||||
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  </div>
|
||||
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> STAmount</div>
|
||||
<div class="line"><a name="l01626"></a><span class="lineno"><a class="line" href="namespaceripple.html#a2853997797ff121f19b538ff9f8c4ba0"> 1626</a></span> <a class="code" href="namespaceripple.html#a2853997797ff121f19b538ff9f8c4ba0">divRoundStrict</a>(</div>
|
||||
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& num,</div>
|
||||
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  <a class="code" href="classripple_1_1STAmount.html">STAmount</a> <span class="keyword">const</span>& den,</div>
|
||||
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  <a class="code" href="classripple_1_1Issue.html">Issue</a> <span class="keyword">const</span>& issue,</div>
|
||||
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  <span class="keywordtype">bool</span> roundUp)</div>
|
||||
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span> {</div>
|
||||
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  <span class="keywordflow">return</span> divRoundImpl<NumberRoundModeGuard>(num, den, issue, roundUp);</div>
|
||||
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> }</div>
|
||||
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  </div>
|
||||
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> } <span class="comment">// namespace ripple</span></div>
|
||||
</div><!-- fragment --></div><!-- contents -->
|
||||
<div class="ttc" id="aclassJson_1_1Value_html_aff51d8b52979ca06cf9d909accd5f695"><div class="ttname"><a href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">Json::Value::isInt</a></div><div class="ttdeci">bool isInt() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00979">json_value.cpp:979</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_adfc9be8e6e0843a250f7810a4b887f1f"><div class="ttname"><a href="classripple_1_1STAmount.html#adfc9be8e6e0843a250f7810a4b887f1f">ripple::STAmount::mIsNative</a></div><div class="ttdeci">bool mIsNative</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8h_source.html#l00056">STAmount.h:56</a></div></div>
|
||||
@@ -1560,11 +1733,13 @@ $(function() {
|
||||
<div class="ttc" id="afind_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/find.html">std::find_if</a></div><div class="ttdeci">T find_if(T... args)</div></div>
|
||||
<div class="ttc" id="asize_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/size.html">std::string::length</a></div><div class="ttdeci">T length(T... args)</div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a3e7e3f29aef85bcca06706da54e950fcaab5dbff88c1be883ec12b49a359d2080"><div class="ttname"><a href="namespaceripple.html#a3e7e3f29aef85bcca06706da54e950fcaab5dbff88c1be883ec12b49a359d2080">ripple::STI_AMOUNT</a></div><div class="ttdeci">@ STI_AMOUNT</div><div class="ttdef"><b>Definition:</b> <a href="SField_8h_source.html#l00063">SField.h:63</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_ab5dd5d90c482d9f8a2549b7dd3863b8b"><div class="ttname"><a href="namespaceripple.html#ab5dd5d90c482d9f8a2549b7dd3863b8b">ripple::mulRoundStrict</a></div><div class="ttdeci">STAmount mulRoundStrict(STAmount const &v1, STAmount const &v2, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01521">STAmount.cpp:1521</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_aa65826cb148b5d15412fceecca5ae47c"><div class="ttname"><a href="classripple_1_1STAmount.html#aa65826cb148b5d15412fceecca5ae47c">ripple::STAmount::getText</a></div><div class="ttdeci">std::string getText() const override</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00571">STAmount.cpp:571</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_a02bef3696a9cb07b72e5ec750e7ea456"><div class="ttname"><a href="classripple_1_1STAmount.html#a02bef3696a9cb07b72e5ec750e7ea456">ripple::STAmount::getJson</a></div><div class="ttdeci">Json::Value getJson(JsonOptions) const override</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00655">STAmount.cpp:655</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a3e7e3f29aef85bcca06706da54e950fc"><div class="ttname"><a href="namespaceripple.html#a3e7e3f29aef85bcca06706da54e950fc">ripple::SerializedTypeID</a></div><div class="ttdeci">SerializedTypeID</div><div class="ttdef"><b>Definition:</b> <a href="SField_8h_source.html#l00052">SField.h:52</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_ac73696ba9cf84191fe3d33d6ef9043c7"><div class="ttname"><a href="namespaceripple.html#ac73696ba9cf84191fe3d33d6ef9043c7">ripple::operator-</a></div><div class="ttdeci">Number operator-(Number const &x, Number const &y)</div><div class="ttdef"><b>Definition:</b> <a href="Number_8h_source.html#l00277">Number.h:277</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_a9cb0ba902ff56a3657d4e710a618fa16"><div class="ttname"><a href="classripple_1_1STAmount.html#a9cb0ba902ff56a3657d4e710a618fa16">ripple::STAmount::mValue</a></div><div class="ttdeci">mantissa_type mValue</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8h_source.html#l00054">STAmount.h:54</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_afed19a57936c35db382a67f1d58b6884"><div class="ttname"><a href="namespaceripple.html#afed19a57936c35db382a67f1d58b6884">ripple::canonicalizeRound</a></div><div class="ttdeci">static void canonicalizeRound(bool native, std::uint64_t &value, int &offset, bool)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01290">STAmount.cpp:1290</a></div></div>
|
||||
<div class="ttc" id="aiterator_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/iterator.html">iterator</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1Issue_html_a4b723aa4198e4c630e41de06586e2fe7"><div class="ttname"><a href="classripple_1_1Issue.html#a4b723aa4198e4c630e41de06586e2fe7">ripple::Issue::currency</a></div><div class="ttdeci">Currency currency</div><div class="ttdef"><b>Definition:</b> <a href="Issue_8h_source.html#l00037">Issue.h:37</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a1b237be5c5c7faa68434cdf539f3120a"><div class="ttname"><a href="namespaceripple.html#a1b237be5c5c7faa68434cdf539f3120a">ripple::tenTo14</a></div><div class="ttdeci">static const std::uint64_t tenTo14</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00060">STAmount.cpp:60</a></div></div>
|
||||
@@ -1580,10 +1755,12 @@ $(function() {
|
||||
<div class="ttc" id="aiostream_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/iostream.html">iostream</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_a094bda660d23e258021a2c63112ebc9a"><div class="ttname"><a href="classripple_1_1STAmount.html#a094bda660d23e258021a2c63112ebc9a">ripple::STAmount::iou</a></div><div class="ttdeci">IOUAmount iou() const</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00349">STAmount.cpp:349</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_a796e10f39a5856f195555461d5949fdd"><div class="ttname"><a href="classripple_1_1STAmount.html#a796e10f39a5856f195555461d5949fdd">ripple::STAmount::operator-=</a></div><div class="ttdeci">STAmount & operator-=(STAmount const &)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00390">STAmount.cpp:390</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1Number_html_a33e3d8e7a95979bd1eb22c59703c8534"><div class="ttname"><a href="classripple_1_1Number.html#a33e3d8e7a95979bd1eb22c59703c8534">ripple::Number::rounding_mode</a></div><div class="ttdeci">rounding_mode</div><div class="ttdef"><b>Definition:</b> <a href="Number_8h_source.html#l00161">Number.h:161</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a94e13759bd026c8ac305482e17f05adb"><div class="ttname"><a href="namespaceripple.html#a94e13759bd026c8ac305482e17f05adb">ripple::debugLog</a></div><div class="ttdeci">beast::Journal debugLog()</div><div class="ttdoc">Returns a debug journal.</div><div class="ttdef"><b>Definition:</b> <a href="Log_8cpp_source.html#l00452">Log.cpp:452</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_a6c2ca92e9c91e2a34493d61e02d79ebf"><div class="ttname"><a href="classripple_1_1STAmount.html#a6c2ca92e9c91e2a34493d61e02d79ebf">ripple::STAmount::xrp</a></div><div class="ttdeci">XRPAmount xrp() const</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00334">STAmount.cpp:334</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a07a687e3a16e605ec3b4ecfd29bb6232"><div class="ttname"><a href="namespaceripple.html#a07a687e3a16e605ec3b4ecfd29bb6232">ripple::canonicalizeRoundStrict</a></div><div class="ttdeci">static void canonicalizeRoundStrict(bool native, std::uint64_t &value, int &offset, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01329">STAmount.cpp:1329</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a4a7f562868748b9246dbcab39091021c"><div class="ttname"><a href="namespaceripple.html#a4a7f562868748b9246dbcab39091021c">ripple::operator==</a></div><div class="ttdeci">bool operator==(Manifest const &lhs, Manifest const &rhs)</div><div class="ttdef"><b>Definition:</b> <a href="Manifest_8h_source.html#l00165">Manifest.h:165</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a7806e73f2a04df365821602cfcf89ff2"><div class="ttname"><a href="namespaceripple.html#a7806e73f2a04df365821602cfcf89ff2">ripple::mulRound</a></div><div class="ttdeci">STAmount mulRound(STAmount const &v1, STAmount const &v2, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01305">STAmount.cpp:1305</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a7806e73f2a04df365821602cfcf89ff2"><div class="ttname"><a href="namespaceripple.html#a7806e73f2a04df365821602cfcf89ff2">ripple::mulRound</a></div><div class="ttdeci">STAmount mulRound(STAmount const &v1, STAmount const &v2, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01510">STAmount.cpp:1510</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a73cc988e7ba5d5ee0fd9db53740917ec"><div class="ttname"><a href="namespaceripple.html#a73cc988e7ba5d5ee0fd9db53740917ec">ripple::getRate</a></div><div class="ttdeci">std::uint64_t getRate(STAmount const &offerOut, STAmount const &offerIn)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00495">STAmount.cpp:495</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a0ad557cc32ca87dcea19af8e30c63c6a"><div class="ttname"><a href="namespaceripple.html#a0ad557cc32ca87dcea19af8e30c63c6a">ripple::divide</a></div><div class="ttdeci">STAmount divide(STAmount const &amount, Rate const &rate)</div><div class="ttdef"><b>Definition:</b> <a href="Rate2_8cpp_source.html#l00086">Rate2.cpp:86</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_aee39db45aa65eddca7002ad9bf3e7877"><div class="ttname"><a href="classripple_1_1STAmount.html#aee39db45aa65eddca7002ad9bf3e7877">ripple::STAmount::getFullText</a></div><div class="ttdeci">std::string getFullText() const override</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00548">STAmount.cpp:548</a></div></div>
|
||||
@@ -1598,20 +1775,23 @@ $(function() {
|
||||
<div class="ttc" id="aclassripple_1_1SerialIter_html_af720e6387dcaba61af9c9c724e33097e"><div class="ttname"><a href="classripple_1_1SerialIter.html#af720e6387dcaba61af9c9c724e33097e">ripple::SerialIter::get64</a></div><div class="ttdeci">std::uint64_t get64()</div><div class="ttdef"><b>Definition:</b> <a href="Serializer_8cpp_source.html#l00399">Serializer.cpp:399</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_ab6d31494e9d7c609592db5a019b2fb7d"><div class="ttname"><a href="namespaceripple.html#ab6d31494e9d7c609592db5a019b2fb7d">ripple::setSTAmountCanonicalizeSwitchover</a></div><div class="ttdeci">void setSTAmountCanonicalizeSwitchover(bool v)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00055">STAmount.cpp:55</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_ae7f0e432d5fa980cfc588654bb6c77d7"><div class="ttname"><a href="namespaceripple.html#ae7f0e432d5fa980cfc588654bb6c77d7">ripple::operator<</a></div><div class="ttdeci">bool operator<(CanonicalTXSet::Key const &lhs, CanonicalTXSet::Key const &rhs)</div><div class="ttdef"><b>Definition:</b> <a href="CanonicalTXSet_8cpp_source.html#l00025">CanonicalTXSet.cpp:25</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a47b15adfd6fb69767c64f50d860a11cc"><div class="ttname"><a href="namespaceripple.html#a47b15adfd6fb69767c64f50d860a11cc">ripple::divRound</a></div><div class="ttdeci">STAmount divRound(STAmount const &num, STAmount const &den, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01391">STAmount.cpp:1391</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1Number_html_a9f2a0df7ad0f278908643927a19592f2"><div class="ttname"><a href="classripple_1_1Number.html#a9f2a0df7ad0f278908643927a19592f2">ripple::Number::setround</a></div><div class="ttdeci">static rounding_mode setround(rounding_mode mode)</div><div class="ttdef"><b>Definition:</b> <a href="Number_8cpp_source.html#l00047">Number.cpp:47</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a47b15adfd6fb69767c64f50d860a11cc"><div class="ttname"><a href="namespaceripple.html#a47b15adfd6fb69767c64f50d860a11cc">ripple::divRound</a></div><div class="ttdeci">STAmount divRound(STAmount const &num, STAmount const &den, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01616">STAmount.cpp:1616</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1SerialIter_html_a2fe5dd5ca6e8bf2f927b1ddefeb3430b"><div class="ttname"><a href="classripple_1_1SerialIter.html#a2fe5dd5ca6e8bf2f927b1ddefeb3430b">ripple::SerialIter::get160</a></div><div class="ttdeci">uint160 get160()</div><div class="ttdef"><b>Definition:</b> <a href="Serializer_8h_source.html#l00370">Serializer.h:370</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a2853997797ff121f19b538ff9f8c4ba0"><div class="ttname"><a href="namespaceripple.html#a2853997797ff121f19b538ff9f8c4ba0">ripple::divRoundStrict</a></div><div class="ttdeci">STAmount divRoundStrict(STAmount const &num, STAmount const &den, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01626">STAmount.cpp:1626</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1Number_html_a33e3d8e7a95979bd1eb22c59703c8534afed3119e1980867324d399f42cbf548d"><div class="ttname"><a href="classripple_1_1Number.html#a33e3d8e7a95979bd1eb22c59703c8534afed3119e1980867324d399f42cbf548d">ripple::Number::towards_zero</a></div><div class="ttdeci">@ towards_zero</div><div class="ttdef"><b>Definition:</b> <a href="Number_8h_source.html#l00161">Number.h:161</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a6f30ee31f9359c69a5294921d5c10d0b"><div class="ttname"><a href="namespaceripple.html#a6f30ee31f9359c69a5294921d5c10d0b">ripple::safe_cast</a></div><div class="ttdeci">constexpr std::enable_if_t< std::is_same_v< typename Dest::unit_type, typename Src::unit_type > &&std::is_integral_v< typename Dest::value_type > &&std::is_integral_v< typename Src::value_type >, Dest > safe_cast(Src s) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="FeeUnits_8h_source.html#l00532">FeeUnits.h:532</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_aa40b0743a468d95eeaaf4914ea555866"><div class="ttname"><a href="classripple_1_1STAmount.html#aa40b0743a468d95eeaaf4914ea555866">ripple::STAmount::value</a></div><div class="ttdeci">STAmount const & value() const noexcept</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8h_source.html#l00440">STAmount.h:440</a></div></div>
|
||||
<div class="ttc" id="ato_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/to_string.html">std::to_string</a></div><div class="ttdeci">T to_string(T... args)</div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_abfd99ece02b928ee8520192a67595e46"><div class="ttname"><a href="namespaceripple.html#abfd99ece02b928ee8520192a67595e46">ripple::muldiv</a></div><div class="ttdeci">static std::uint64_t muldiv(std::uint64_t multiplier, std::uint64_t multiplicand, std::uint64_t divisor)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01121">STAmount.cpp:1121</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html"><div class="ttname"><a href="classripple_1_1STAmount.html">ripple::STAmount</a></div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8h_source.html#l00045">STAmount.h:45</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_aa2e515ce9112a60a7d65f0829d0efadf"><div class="ttname"><a href="namespaceripple.html#aa2e515ce9112a60a7d65f0829d0efadf">ripple::divRoundImpl</a></div><div class="ttdeci">static STAmount divRoundImpl(STAmount const &num, STAmount const &den, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01535">STAmount.cpp:1535</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a4b4bd638a3aaa56c3b3dc28ccd4ca3b8"><div class="ttname"><a href="namespaceripple.html#a4b4bd638a3aaa56c3b3dc28ccd4ca3b8">ripple::getSTAmountCanonicalizeSwitchover</a></div><div class="ttdeci">bool getSTAmountCanonicalizeSwitchover()</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00049">STAmount.cpp:49</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a3c25b36b542a985c4f2d344df683a2dd"><div class="ttname"><a href="namespaceripple.html#a3c25b36b542a985c4f2d344df683a2dd">ripple::amountFromJson</a></div><div class="ttdeci">STAmount amountFromJson(SField const &name, Json::Value const &v)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00929">STAmount.cpp:929</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a20d30277b9c78756b3d14493055a307c"><div class="ttname"><a href="namespaceripple.html#a20d30277b9c78756b3d14493055a307c">ripple::isXRP</a></div><div class="ttdeci">bool isXRP(AccountID const &c)</div><div class="ttdef"><b>Definition:</b> <a href="AccountID_8h_source.html#l00089">AccountID.h:89</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1SerialIter_html"><div class="ttname"><a href="classripple_1_1SerialIter.html">ripple::SerialIter</a></div><div class="ttdef"><b>Definition:</b> <a href="Serializer_8h_source.html#l00310">Serializer.h:310</a></div></div>
|
||||
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_a3758d676b17e36e61b94cb3fec90dcdf"><div class="ttname"><a href="classripple_1_1STAmount.html#a3758d676b17e36e61b94cb3fec90dcdf">ripple::STAmount::setIssue</a></div><div class="ttdeci">void setIssue(Issue const &issue)</div><div class="ttdoc">Set the Issue for this amount and update mIsNative.</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00479">STAmount.cpp:479</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_af5a98b092dca8d35b8913320f354fb1f"><div class="ttname"><a href="namespaceripple.html#af5a98b092dca8d35b8913320f354fb1f">ripple::canonicalizeRound</a></div><div class="ttdeci">static void canonicalizeRound(bool native, std::uint64_t &value, int &offset)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01270">STAmount.cpp:1270</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_a6a24e9e13e8aaaabf693f101c1a8e21b"><div class="ttname"><a href="classripple_1_1STAmount.html#a6a24e9e13e8aaaabf693f101c1a8e21b">ripple::STAmount::construct</a></div><div class="ttdeci">static std::unique_ptr< STAmount > construct(SerialIter &, SField const &name)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00311">STAmount.cpp:311</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a4afbbae0910419307600d5545004e5be"><div class="ttname"><a href="namespaceripple.html#a4afbbae0910419307600d5545004e5be">ripple::amountFromQuality</a></div><div class="ttdeci">STAmount amountFromQuality(std::uint64_t rate)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00852">STAmount.cpp:852</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a30c2e63999ddc369a258a7c2766e968f"><div class="ttname"><a href="namespaceripple.html#a30c2e63999ddc369a258a7c2766e968f">ripple::areComparable</a></div><div class="ttdeci">static bool areComparable(STAmount const &v1, STAmount const &v2)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00082">STAmount.cpp:82</a></div></div>
|
||||
@@ -1666,6 +1846,7 @@ $(function() {
|
||||
<div class="ttc" id="aclassripple_1_1STAmount_html_af88c7b9a2ee49408f4fd17e1ee9f20df"><div class="ttname"><a href="classripple_1_1STAmount.html#af88c7b9a2ee49408f4fd17e1ee9f20df">ripple::STAmount::cMaxValue</a></div><div class="ttdeci">static const std::uint64_t cMaxValue</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8h_source.html#l00067">STAmount.h:67</a></div></div>
|
||||
<div class="ttc" id="awhat_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/error/exception/what.html">std::exception::what</a></div><div class="ttdeci">T what(T... args)</div></div>
|
||||
<div class="ttc" id="aclassJson_1_1Value_html"><div class="ttname"><a href="classJson_1_1Value.html">Json::Value</a></div><div class="ttdoc">Represents a JSON value.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00145">json_value.h:145</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a66208551f9f42710e224cee24b7ba206"><div class="ttname"><a href="namespaceripple.html#a66208551f9f42710e224cee24b7ba206">ripple::mulRoundImpl</a></div><div class="ttdeci">static STAmount mulRoundImpl(STAmount const &v1, STAmount const &v2, Issue const &issue, bool roundUp)</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l01417">STAmount.cpp:1417</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1XRPAmount_html"><div class="ttname"><a href="classripple_1_1XRPAmount.html">ripple::XRPAmount</a></div><div class="ttdef"><b>Definition:</b> <a href="XRPAmount_8h_source.html#l00046">XRPAmount.h:46</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a300af819bde0c7c49207d10cd787e62e"><div class="ttname"><a href="namespaceripple.html#a300af819bde0c7c49207d10cd787e62e">ripple::to_issuer</a></div><div class="ttdeci">bool to_issuer(AccountID &, std::string const &)</div><div class="ttdoc">Convert hex or base58 string to AccountID.</div><div class="ttdef"><b>Definition:</b> <a href="AccountID_8cpp_source.html#l00182">AccountID.cpp:182</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_abc2f04db8f54f17ec5d0268d566b7a4d"><div class="ttname"><a href="namespaceripple.html#abc2f04db8f54f17ec5d0268d566b7a4d">ripple::tenTo17</a></div><div class="ttdeci">static const std::uint64_t tenTo17</div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8cpp_source.html#l00062">STAmount.cpp:62</a></div></div>
|
||||
|
||||
Reference in New Issue
Block a user