mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
Use Number for IOUAmount and STAmount arithmetic
* Guarded by amendment fixUniversalNumber * Produces slightly better accuracy in some computations.
This commit is contained in:
committed by
Elliot Lee
parent
48e804c40c
commit
a82ad5ba76
@@ -74,7 +74,7 @@ namespace detail {
|
||||
// Feature.cpp. Because it's only used to reserve storage, and determine how
|
||||
// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
|
||||
// the actual number of amendments. A LogicError on startup will verify this.
|
||||
static constexpr std::size_t numFeatures = 55;
|
||||
static constexpr std::size_t numFeatures = 56;
|
||||
|
||||
/** Amendments that this server supports and the default voting behavior.
|
||||
Whether they are enabled depends on the Rules defined in the validated
|
||||
@@ -340,8 +340,12 @@ extern uint256 const featureNonFungibleTokensV1_1;
|
||||
extern uint256 const fixTrustLinesToSelf;
|
||||
extern uint256 const fixRemoveNFTokenAutoTrustLine;
|
||||
extern uint256 const featureImmediateOfferKilled;
|
||||
<<<<<<< HEAD
|
||||
extern uint256 const featureDisallowIncoming;
|
||||
extern uint256 const featureXRPFees;
|
||||
=======
|
||||
extern uint256 const fixUniversalNumber;
|
||||
>>>>>>> Use Number for IOUAmount and STAmount arithmetic
|
||||
|
||||
} // namespace ripple
|
||||
|
||||
|
||||
@@ -277,7 +277,13 @@ private:
|
||||
STBase*
|
||||
move(std::size_t n, void* buf) override;
|
||||
|
||||
STAmount&
|
||||
operator=(IOUAmount const& iou);
|
||||
|
||||
friend class detail::STVar;
|
||||
|
||||
friend STAmount
|
||||
operator+(STAmount const& v1, STAmount const& v2);
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
@@ -452,6 +452,7 @@ REGISTER_FIX (fixRemoveNFTokenAutoTrustLine, Supported::yes, DefaultVote::yes
|
||||
REGISTER_FEATURE(ImmediateOfferKilled, Supported::yes, DefaultVote::no);
|
||||
REGISTER_FEATURE(DisallowIncoming, Supported::yes, DefaultVote::no);
|
||||
REGISTER_FEATURE(XRPFees, Supported::yes, DefaultVote::no);
|
||||
REGISTER_FIX (fixUniversalNumber, Supported::yes, DefaultVote::yes);
|
||||
|
||||
// The following amendments have been active for at least two years. Their
|
||||
// pre-amendment code has been removed and the identifiers are deprecated.
|
||||
|
||||
@@ -339,6 +339,19 @@ STAmount::iou() const
|
||||
return {mantissa, exponent};
|
||||
}
|
||||
|
||||
STAmount&
|
||||
STAmount::operator=(IOUAmount const& iou)
|
||||
{
|
||||
assert(mIsNative == false);
|
||||
mOffset = iou.exponent();
|
||||
mIsNegative = iou < beast::zero;
|
||||
if (mIsNegative)
|
||||
mValue = static_cast<std::uint64_t>(-iou.mantissa());
|
||||
else
|
||||
mValue = static_cast<std::uint64_t>(iou.mantissa());
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Operators
|
||||
@@ -382,6 +395,13 @@ operator+(STAmount const& v1, STAmount const& v2)
|
||||
if (v1.native())
|
||||
return {v1.getFName(), getSNValue(v1) + getSNValue(v2)};
|
||||
|
||||
if (*stNumberSwitchover)
|
||||
{
|
||||
auto x = v1;
|
||||
x = v1.iou() + v2.iou();
|
||||
return x;
|
||||
}
|
||||
|
||||
int ov1 = v1.exponent(), ov2 = v2.exponent();
|
||||
std::int64_t vv1 = static_cast<std::int64_t>(v1.mantissa());
|
||||
std::int64_t vv2 = static_cast<std::int64_t>(v2.mantissa());
|
||||
@@ -733,6 +753,12 @@ STAmount::canonicalize()
|
||||
|
||||
mIsNative = false;
|
||||
|
||||
if (*stNumberSwitchover)
|
||||
{
|
||||
*this = iou();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mValue == 0)
|
||||
{
|
||||
mOffset = -100;
|
||||
@@ -1170,6 +1196,9 @@ multiply(STAmount const& v1, STAmount const& v2, Issue const& issue)
|
||||
return STAmount(v1.getFName(), minV * maxV);
|
||||
}
|
||||
|
||||
if (*stNumberSwitchover)
|
||||
return {IOUAmount{Number{v1} * Number{v2}}, issue};
|
||||
|
||||
std::uint64_t value1 = v1.mantissa();
|
||||
std::uint64_t value2 = v2.mantissa();
|
||||
int offset1 = v1.exponent();
|
||||
|
||||
Reference in New Issue
Block a user