20#ifndef RIPPLE_PROTOCOL_STAMOUNT_H_INCLUDED
21#define RIPPLE_PROTOCOL_STAMOUNT_H_INCLUDED
23#include <xrpl/basics/CountedObject.h>
24#include <xrpl/basics/LocalValue.h>
25#include <xrpl/basics/Number.h>
26#include <xrpl/beast/utility/instrumentation.h>
27#include <xrpl/protocol/Asset.h>
28#include <xrpl/protocol/IOUAmount.h>
29#include <xrpl/protocol/Issue.h>
30#include <xrpl/protocol/MPTAmount.h>
31#include <xrpl/protocol/SField.h>
32#include <xrpl/protocol/STBase.h>
33#include <xrpl/protocol/Serializer.h>
34#include <xrpl/protocol/XRPAmount.h>
35#include <xrpl/protocol/json_get_or_throw.h>
91 template <AssetType A>
100 template <AssetType A>
109 template <AssetType A>
128 template <AssetType A>
143 template <AssetType A>
150 template <AssetType A>
153 template <AssetType A>
156 template <AssetType A>
182 holds() const noexcept;
194 constexpr TIss const&
218 value() const noexcept;
227 operator
bool() const noexcept;
308 copy(
std::
size_t n,
void* buf) const override;
310 move(
std::
size_t n,
void* buf) override;
337template <AssetType A>
348template <AssetType A>
359 , mIsNegative(negative)
364 "ripple::STAmount::STAmount(SField, A, std::uint64_t, int, bool) : "
365 "maximum mantissa input");
369template <AssetType A>
371 : mAsset(asset), mOffset(exponent)
377template <AssetType A>
387template <AssetType A>
396 , mOffset(amount.exponent())
397 , mIsNegative(amount <
beast::zero)
408 : mAsset(mptIssue), mOffset(0), mIsNegative(amount <
beast::zero)
411 mValue = unsafe_cast<std::uint64_t>(-amount.
value());
413 mValue = unsafe_cast<std::uint64_t>(amount.
value());
463template <Val
idIssueType TIss>
488template <Val
idIssueType TIss>
525inline STAmount::operator bool() const noexcept
527 return *
this != beast::zero;
566 if (*
this != beast::zero)
612operator==(STAmount
const& lhs, STAmount
const& rhs);
614operator<(STAmount
const& lhs, STAmount
const& rhs);
619 return !(lhs == rhs);
650operator+(STAmount
const& v1, STAmount
const& v2);
652operator-(STAmount
const& v1, STAmount
const& v2);
655divide(STAmount
const& v1, STAmount
const& v2, Asset
const& asset);
658multiply(STAmount
const& v1, STAmount
const& v2, Asset
const& asset);
696getRate(STAmount
const& offerOut, STAmount
const& offerIn);
748 Throw<JsonMissingKeyError>(key);
750 return amountFromJson(field, inner);
Lightweight wrapper to tag static string.
bool isMember(char const *key) const
Return true if the object has a member named key.
constexpr TIss const & get() const
AccountID const & getIssuer() const
constexpr bool holds() const
Tracks the number of instances of an object.
Floating point representation of amounts with high dynamic range.
std::int64_t mantissa() const noexcept
A currency issued by an account.
constexpr value_type value() const
Returns the underlying value.
constexpr int exponent() const noexcept
constexpr rep mantissa() const noexcept
RAII class to set and restore the STAmount canonicalize switchover.
constexpr bool holds() const noexcept
Json::Value getJson(JsonOptions=JsonOptions::none) const override
static std::uint64_t const cMaxNativeN
STAmount & operator=(beast::Zero)
int exponent() const noexcept
STBase * move(std::size_t n, void *buf) override
Asset const & asset() const
static std::uint64_t const cPositive
constexpr TIss const & get() const
void setIssuer(AccountID const &uIssuer)
static int const cMaxOffset
static int const cMinOffset
Currency const & getCurrency() const
friend class detail::STVar
static std::uint64_t const cMinValue
static std::unique_ptr< STAmount > construct(SerialIter &, SField const &name)
void setIssue(Asset const &asset)
Set the Issue for this amount.
void setJson(Json::Value &) const
bool isDefault() const override
void add(Serializer &s) const override
static std::uint64_t const cIssuedCurrency
static std::uint64_t const cMPToken
SerializedTypeID getSType() const override
int signum() const noexcept
static std::uint64_t const cMaxValue
STAmount const & value() const noexcept
std::string getText() const override
bool negative() const noexcept
AccountID const & getIssuer() const
bool isEquivalent(STBase const &t) const override
STAmount(A const &asset, std::uint64_t mantissa=0, int exponent=0, bool negative=false)
STBase * copy(std::size_t n, void *buf) const override
static std::uint64_t const cValueMask
Issue const & issue() const
static std::uint64_t const cMaxNative
STAmount(A const &asset, Number const &number)
std::uint64_t mantissa() const noexcept
std::string getFullText() const override
STAmount(SerialIter &sit, SField const &name)
bool native() const noexcept
STAmount zeroed() const
Returns a zero value with the same issuer and currency.
static std::uint64_t const uRateOne
A type which can be exported to a well known binary format.
JSON (JavaScript Object Notation).
ripple::AccountID getOrThrow(Json::Value const &v, ripple::SField const &field)
static Number number(STAmount const &a)
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
bool operator<=(STAmount const &lhs, STAmount const &rhs)
STAmount divide(STAmount const &amount, Rate const &rate)
bool isXRP(AccountID const &c)
bool operator!=(Buffer const &lhs, Buffer const &rhs) noexcept
STAmount divRoundStrict(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
STAmount amountFromJson(SField const &name, Json::Value const &v)
bool isLegalNet(STAmount const &value)
constexpr std::enable_if_t< std::is_integral_v< Dest > &&std::is_integral_v< Src >, Dest > safe_cast(Src s) noexcept
STAmount toSTAmount(IOUAmount const &iou, Issue const &iss)
STAmount amountFromQuality(std::uint64_t rate)
bool getSTAmountCanonicalizeSwitchover()
STAmount multiply(STAmount const &amount, Rate const &rate)
std::uint64_t getRate(STAmount const &offerOut, STAmount const &offerIn)
bool operator>(STAmount const &lhs, STAmount const &rhs)
bool amountFromJsonNoThrow(STAmount &result, Json::Value const &jvSource)
bool operator<(Slice const &lhs, Slice const &rhs) noexcept
void setSTAmountCanonicalizeSwitchover(bool v)
STAmount divRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
Number operator-(Number const &x, Number const &y)
STAmount amountFromString(Asset const &asset, std::string const &amount)
STAmount mulRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
constexpr base_uint< Bits, Tag > operator+(base_uint< Bits, Tag > const &a, base_uint< Bits, Tag > const &b)
constexpr bool operator==(base_uint< Bits, Tag > const &lhs, base_uint< Bits, Tag > const &rhs)
STAmount mulRoundStrict(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
bool operator>=(STAmount const &lhs, STAmount const &rhs)
Zero allows classes to offer efficient comparisons to zero.
Note, should be treated as flags that can be | and &.