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 *MulRoundFunc)(STAmount
const&, STAmount
const&, Issue
const&, bool)>
88 Amounts
const& amount,
91 Quality
const& quality)
93 if (amount.out > limit)
96 MulRoundFunc(limit, quality.rate(), amount.in.issue(), roundUp),
99 if (result.in > amount.in)
100 result.in = amount.in;
101 assert(result.out == limit);
104 assert(amount.out <= limit);
109 Quality::ceil_out(Amounts
const& amount, STAmount
const& limit)
const
111 return ceil_out_impl<mulRound>(amount, limit,
true, *
this);
115 Quality::ceil_out_strict(
116 Amounts
const& amount,
117 STAmount
const& limit,
120 return ceil_out_impl<mulRoundStrict>(amount, limit, roundUp, *
this);
126 STAmount const lhs_rate(lhs.rate());
127 assert(lhs_rate != beast::zero);
129 STAmount const rhs_rate(rhs.rate());
130 assert(rhs_rate != beast::zero);
137 assert((stored_exponent > 0) && (stored_exponent <= 255));
139 return Quality((stored_exponent << (64 - 8)) | stored_mantissa);
143 Quality::round(
int digits)
const
166 auto exponent = m_value >> (64 - 8);
167 auto mantissa = m_value & 0x00ffffffffffffffULL;
168 mantissa += mod[digits] - 1;
169 mantissa -= (mantissa % mod[digits]);
171 return Quality{(exponent << (64 - 8)) | mantissa};