20#include <xrpl/beast/utility/Zero.h> 
   21#include <xrpl/beast/utility/instrumentation.h> 
   22#include <xrpl/protocol/Asset.h> 
   23#include <xrpl/protocol/Quality.h> 
   24#include <xrpl/protocol/STAmount.h> 
   35Quality::Quality(Amounts 
const& amount)
 
   43    XRPL_ASSERT(m_value > 0, 
"ripple::Quality::operator++() : minimum value");
 
   49Quality::operator++(
int)
 
   61        "ripple::Quality::operator--() : maximum value");
 
   67Quality::operator--(
int)
 
   75    *DivRoundFunc)(STAmount 
const&, STAmount 
const&, Asset 
const&, bool)>
 
   78    Amounts 
const& amount,
 
   81    Quality 
const& quality)
 
   83    if (amount.in > limit)
 
   87            DivRoundFunc(limit, quality.rate(), amount.out.asset(), roundUp));
 
   89        if (result.out > amount.out)
 
   90            result.out = amount.out;
 
   92            result.in == limit, 
"ripple::ceil_in_impl : result matches limit");
 
   96        amount.in <= limit, 
"ripple::ceil_in_impl : result inside limit");
 
 
  101Quality::ceil_in(Amounts 
const& amount, STAmount 
const& limit)
 const 
  103    return ceil_in_impl<divRound>(amount, limit,  
true, *
this);
 
  107Quality::ceil_in_strict(
 
  108    Amounts 
const& amount,
 
  109    STAmount 
const& limit,
 
  112    return ceil_in_impl<divRoundStrict>(amount, limit, roundUp, *
this);
 
  116    *MulRoundFunc)(STAmount 
const&, STAmount 
const&, Asset 
const&, bool)>
 
  119    Amounts 
const& amount,
 
  122    Quality 
const& quality)
 
  124    if (amount.out > limit)
 
  127            MulRoundFunc(limit, quality.rate(), amount.in.asset(), roundUp),
 
  130        if (result.in > amount.in)
 
  131            result.in = amount.in;
 
  134            "ripple::ceil_out_impl : result matches limit");
 
  138        amount.out <= limit, 
"ripple::ceil_out_impl : result inside limit");
 
 
  143Quality::ceil_out(Amounts 
const& amount, STAmount 
const& limit)
 const 
  145    return ceil_out_impl<mulRound>(amount, limit,  
true, *
this);
 
  149Quality::ceil_out_strict(
 
  150    Amounts 
const& amount,
 
  151    STAmount 
const& limit,
 
  154    return ceil_out_impl<mulRoundStrict>(amount, limit, roundUp, *
this);
 
  160    STAmount const lhs_rate(lhs.rate());
 
  162        lhs_rate != beast::zero,
 
  163        "ripple::composed_quality : nonzero left input");
 
  165    STAmount const rhs_rate(rhs.rate());
 
  167        rhs_rate != beast::zero,
 
  168        "ripple::composed_quality : nonzero right input");
 
  176        (stored_exponent > 0) && (stored_exponent <= 255),
 
  177        "ripple::composed_quality : valid exponent");
 
  179    return Quality((stored_exponent << (64 - 8)) | stored_mantissa);
 
 
  183Quality::round(
int digits)
 const 
  206    auto exponent = m_value >> (64 - 8);
 
  207    auto mantissa = m_value & 0x00ffffffffffffffULL;
 
  208    mantissa += mod[digits] - 1;
 
  209    mantissa -= (mantissa % mod[digits]);
 
  211    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)