1#ifndef XRPL_PROTOCOL_STAMOUNT_H_INCLUDED
2#define XRPL_PROTOCOL_STAMOUNT_H_INCLUDED
4#include <xrpl/basics/CountedObject.h>
5#include <xrpl/basics/LocalValue.h>
6#include <xrpl/basics/Number.h>
7#include <xrpl/beast/utility/instrumentation.h>
8#include <xrpl/protocol/Asset.h>
9#include <xrpl/protocol/IOUAmount.h>
10#include <xrpl/protocol/Issue.h>
11#include <xrpl/protocol/MPTAmount.h>
12#include <xrpl/protocol/SField.h>
13#include <xrpl/protocol/STBase.h>
14#include <xrpl/protocol/Serializer.h>
15#include <xrpl/protocol/XRPAmount.h>
16#include <xrpl/protocol/json_get_or_throw.h>
72 template <AssetType A>
81 template <AssetType A>
90 template <AssetType A>
109 template <AssetType A>
124 template <AssetType A>
131 template <AssetType A>
134 template <AssetType A>
137 template <AssetType A>
163 holds() const noexcept;
175 constexpr TIss const&
199 value() const noexcept;
208 operator
bool() const noexcept;
289 copy(
std::
size_t n,
void* buf) const override;
291 move(
std::
size_t n,
void* buf) override;
318template <AssetType A>
329template <AssetType A>
340 , mIsNegative(negative)
345 "ripple::STAmount::STAmount(SField, A, std::uint64_t, int, bool) : "
346 "maximum mantissa input");
350template <AssetType A>
352 : mAsset(asset), mOffset(exponent)
358template <AssetType A>
368template <AssetType A>
377 , mOffset(amount.exponent())
378 , mIsNegative(amount <
beast::zero)
389 : mAsset(mptIssue), mOffset(0), mIsNegative(amount <
beast::zero)
392 mValue = unsafe_cast<std::uint64_t>(-amount.
value());
394 mValue = unsafe_cast<std::uint64_t>(amount.
value());
444template <Val
idIssueType TIss>
469template <Val
idIssueType TIss>
506inline STAmount::operator bool() const noexcept
508 return *
this != beast::zero;
547 if (*
this != beast::zero)
593operator==(STAmount
const& lhs, STAmount
const& rhs);
595operator<(STAmount
const& lhs, STAmount
const& rhs);
600 return !(lhs == rhs);
631operator+(STAmount
const& v1, STAmount
const& v2);
633operator-(STAmount
const& v1, STAmount
const& v2);
636divide(STAmount
const& v1, STAmount
const& v2, Asset
const& asset);
639multiply(STAmount
const& v1, STAmount
const& v2, Asset
const& asset);
677getRate(STAmount
const& offerOut, STAmount
const& offerIn);
688canAdd(STAmount
const& amt1, STAmount
const& amt2);
691canSubtract(STAmount
const& amt1, STAmount
const& amt2);
704 Throw<JsonMissingKeyError>(key);
706 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 &.