Add implicit conversion from STAmount to Number

This commit is contained in:
Howard Hinnant
2022-04-20 17:10:04 -04:00
committed by Elliot Lee
parent 24fe5f9fd0
commit c9c54c9799
4 changed files with 24 additions and 8 deletions

View File

@@ -325,7 +325,7 @@ Number::operator*=(Number const& y)
std::to_string(xe));
mantissa_ = xm * zn;
exponent_ = xe;
assert(isnormal());
assert(isnormal() || *this == Number{});
return *this;
}
@@ -362,8 +362,9 @@ Number::operator/=(Number const& y)
static_assert(a2.isnormal());
Number rm2{};
Number rm1{};
Number r = a2;
r = (a2 * d + a1) * d + a0;
Number r = (a2 * d + a1) * d + a0;
// NewtonRaphson iteration of 1/x - d with initial guess r
// halt when r stops changing, checking for bouncing on the last iteration
do
{
rm2 = rm1;
@@ -376,7 +377,7 @@ Number::operator/=(Number const& y)
Number::operator rep() const
{
std::int64_t drops = mantissa_;
rep drops = mantissa_;
int offset = exponent_;
guard g;
if (drops != 0)

View File

@@ -23,6 +23,7 @@
#include <ripple/basics/CountedObject.h>
#include <ripple/basics/IOUAmount.h>
#include <ripple/basics/LocalValue.h>
#include <ripple/basics/Number.h>
#include <ripple/basics/XRPAmount.h>
#include <ripple/protocol/Issue.h>
#include <ripple/protocol/SField.h>
@@ -144,6 +145,7 @@ public:
// Legacy support for new-style amounts
STAmount(IOUAmount const& amount, Issue const& issue);
STAmount(XRPAmount const& amount);
operator Number() const;
//--------------------------------------------------------------------------
//
@@ -370,6 +372,13 @@ inline STAmount::operator bool() const noexcept
return *this != beast::zero;
}
inline STAmount::operator Number() const
{
if (mIsNative)
return xrp();
return iou();
}
inline STAmount& STAmount::operator=(beast::Zero)
{
clear();

View File

@@ -37,11 +37,12 @@ using namespace std::chrono_literals;
boost::filesystem::path
ShardArchiveHandler::getDownloadDirectory(Config const& config)
{
return get(config.section(ConfigSection::shardDatabase()),
"download_path",
return boost::filesystem::path{
get(config.section(ConfigSection::shardDatabase()),
"path",
"")) /
"download_path",
get(config.section(ConfigSection::shardDatabase()),
"path",
""))} /
"download";
}

View File

@@ -20,6 +20,7 @@
#include <ripple/basics/IOUAmount.h>
#include <ripple/basics/Number.h>
#include <ripple/beast/unit_test.h>
#include <ripple/protocol/STAmount.h>
namespace ripple {
@@ -124,6 +125,10 @@ public:
BEAST_EXPECT((y == Number{5, 6}));
IOUAmount z{y};
BEAST_EXPECT(x == z);
XRPAmount xrp{500};
STAmount st = xrp;
Number n = st;
BEAST_EXPECT(XRPAmount{n} == xrp);
}
void