1#include <xrpl/beast/utility/Zero.h>
2#include <xrpl/beast/utility/instrumentation.h>
3#include <xrpl/protocol/Asset.h>
4#include <xrpl/protocol/Quality.h>
5#include <xrpl/protocol/STAmount.h>
23 XRPL_ASSERT(m_value > 0,
"xrpl::Quality::operator++() : minimum value");
29Quality::operator++(
int)
45Quality::operator--(
int)
52template <STAmount (*DivRoundFunc)(STAmount const&, STAmount const&, Asset const&,
bool)>
56 if (amount.in > limit)
58 Amounts result(limit, DivRoundFunc(limit, quality.rate(), amount.out.asset(), roundUp));
60 if (result.out > amount.out)
61 result.out = amount.out;
62 XRPL_ASSERT(result.in == limit,
"xrpl::ceil_in_impl : result matches limit");
65 XRPL_ASSERT(amount.in <= limit,
"xrpl::ceil_in_impl : result inside limit");
70Quality::ceil_in(Amounts
const& amount, STAmount
const& limit)
const
72 return ceil_in_impl<divRound>(amount, limit,
true, *
this);
76Quality::ceil_in_strict(Amounts
const& amount, STAmount
const& limit,
bool roundUp)
const
78 return ceil_in_impl<divRoundStrict>(amount, limit, roundUp, *
this);
81template <STAmount (*MulRoundFunc)(STAmount const&, STAmount const&, Asset const&,
bool)>
85 if (amount.out > limit)
87 Amounts result(MulRoundFunc(limit, quality.rate(), amount.in.asset(), roundUp), limit);
89 if (result.in > amount.in)
90 result.in = amount.in;
91 XRPL_ASSERT(result.out == limit,
"xrpl::ceil_out_impl : result matches limit");
94 XRPL_ASSERT(amount.out <= limit,
"xrpl::ceil_out_impl : result inside limit");
99Quality::ceil_out(Amounts
const& amount, STAmount
const& limit)
const
101 return ceil_out_impl<mulRound>(amount, limit,
true, *
this);
105Quality::ceil_out_strict(Amounts
const& amount, STAmount
const& limit,
bool roundUp)
const
107 return ceil_out_impl<mulRoundStrict>(amount, limit, roundUp, *
this);
113 STAmount const lhs_rate(lhs.rate());
114 XRPL_ASSERT(lhs_rate != beast::zero,
"xrpl::composed_quality : nonzero left input");
116 STAmount const rhs_rate(rhs.rate());
117 XRPL_ASSERT(rhs_rate != beast::zero,
"xrpl::composed_quality : nonzero right input");
124 XRPL_ASSERT((stored_exponent > 0) && (stored_exponent <= 255),
"xrpl::composed_quality : valid exponent");
126 return Quality((stored_exponent << (64 - 8)) | stored_mantissa);
130Quality::round(
int digits)
const
153 auto exponent = m_value >> (64 - 8);
154 auto mantissa = m_value & 0x00ffffffffffffffULL;
155 mantissa += mod[digits] - 1;
156 mantissa -= (mantissa % mod[digits]);
158 return Quality{(exponent << (64 - 8)) | mantissa};
Asset const & asset() const
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Quality composed_quality(Quality const &lhs, Quality const &rhs)
static Amounts ceil_in_impl(Amounts const &amount, STAmount const &limit, bool roundUp, Quality const &quality)
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)
STAmount mulRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)