20#include <xrpl/beast/utility/instrumentation.h>
21#include <xrpl/protocol/Quality.h>
30Quality::Quality(Amounts
const& amount)
38 XRPL_ASSERT(m_value > 0,
"ripple::Quality::operator++() : minimum value");
44Quality::operator++(
int)
56 "ripple::Quality::operator--() : maximum value");
62Quality::operator--(
int)
70 *DivRoundFunc)(STAmount
const&, STAmount
const&, Asset
const&, bool)>
73 Amounts
const& amount,
76 Quality
const& quality)
78 if (amount.in > limit)
82 DivRoundFunc(limit, quality.rate(), amount.out.asset(), roundUp));
84 if (result.out > amount.out)
85 result.out = amount.out;
87 result.in == limit,
"ripple::ceil_in_impl : result matches limit");
91 amount.in <= limit,
"ripple::ceil_in_impl : result inside limit");
96Quality::ceil_in(Amounts
const& amount, STAmount
const& limit)
const
98 return ceil_in_impl<divRound>(amount, limit,
true, *
this);
102Quality::ceil_in_strict(
103 Amounts
const& amount,
104 STAmount
const& limit,
107 return ceil_in_impl<divRoundStrict>(amount, limit, roundUp, *
this);
111 *MulRoundFunc)(STAmount
const&, STAmount
const&, Asset
const&, bool)>
114 Amounts
const& amount,
117 Quality
const& quality)
119 if (amount.out > limit)
122 MulRoundFunc(limit, quality.rate(), amount.in.asset(), roundUp),
125 if (result.in > amount.in)
126 result.in = amount.in;
129 "ripple::ceil_out_impl : result matches limit");
133 amount.out <= limit,
"ripple::ceil_out_impl : result inside limit");
138Quality::ceil_out(Amounts
const& amount, STAmount
const& limit)
const
140 return ceil_out_impl<mulRound>(amount, limit,
true, *
this);
144Quality::ceil_out_strict(
145 Amounts
const& amount,
146 STAmount
const& limit,
149 return ceil_out_impl<mulRoundStrict>(amount, limit, roundUp, *
this);
155 STAmount const lhs_rate(lhs.rate());
157 lhs_rate != beast::zero,
158 "ripple::composed_quality : nonzero left input");
160 STAmount const rhs_rate(rhs.rate());
162 rhs_rate != beast::zero,
163 "ripple::composed_quality : nonzero right input");
171 (stored_exponent > 0) && (stored_exponent <= 255),
172 "ripple::composed_quality : valid exponent");
174 return Quality((stored_exponent << (64 - 8)) | stored_mantissa);
178Quality::round(
int digits)
const
201 auto exponent = m_value >> (64 - 8);
202 auto mantissa = m_value & 0x00ffffffffffffffULL;
203 mantissa += mod[digits] - 1;
204 mantissa -= (mantissa % mod[digits]);
206 return Quality{(exponent << (64 - 8)) | mantissa};
Asset const & asset() const
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
static Amounts ceil_out_impl(Amounts const &amount, STAmount const &limit, bool roundUp, Quality const &quality)
std::uint64_t getRate(STAmount const &offerOut, STAmount const &offerIn)
static Amounts ceil_in_impl(Amounts const &amount, STAmount const &limit, bool roundUp, Quality const &quality)
Quality composed_quality(Quality const &lhs, Quality const &rhs)
STAmount mulRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)