20 #include <ripple/protocol/Quality.h>
30 Quality::Quality(Amounts
const& amount)
44 Quality::operator++(
int)
60 Quality::operator--(
int)
68 Quality::ceil_in(Amounts
const& amount, STAmount
const& limit)
const
70 if (amount.in > limit)
73 limit,
divRound(limit,
rate(), amount.out.issue(),
true));
75 if (result.out > amount.out)
76 result.out = amount.out;
77 assert(result.in == limit);
80 assert(amount.in <= limit);
85 Quality::ceil_out(Amounts
const& amount, STAmount
const& limit)
const
87 if (amount.out > limit)
89 Amounts result(
mulRound(limit,
rate(), amount.in.issue(),
true), limit);
91 if (result.in > amount.in)
92 result.in = amount.in;
93 assert(result.out == limit);
96 assert(amount.out <= limit);
103 STAmount const lhs_rate(lhs.rate());
104 assert(lhs_rate != beast::zero);
106 STAmount const rhs_rate(rhs.rate());
107 assert(rhs_rate != beast::zero);
114 assert((stored_exponent > 0) && (stored_exponent <= 255));
116 return Quality((stored_exponent << (64 - 8)) | stored_mantissa);
120 Quality::round(
int digits)
const
143 auto exponent = m_value >> (64 - 8);
144 auto mantissa = m_value & 0x00ffffffffffffffULL;
145 mantissa += mod[digits] - 1;
146 mantissa -= (mantissa % mod[digits]);
148 return Quality{(exponent << (64 - 8)) | mantissa};