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);
707canAdd(STAmount
const& amt1, STAmount
const& amt2);
710canSubtract(STAmount
const& amt1, STAmount
const& amt2);
723 Throw<JsonMissingKeyError>(key);
725 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
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)
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
bool canSubtract(STAmount const &amt1, STAmount const &amt2)
Determines if it is safe to subtract one STAmount from another.
STAmount divRoundStrict(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
STAmount amountFromJson(SField const &name, Json::Value const &v)
bool canAdd(STAmount const &amt1, STAmount const &amt2)
Safely checks if two STAmount values can be added without overflow, underflow, or precision loss.
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)
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
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 &.