mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 11:05:54 +00:00
Merge remote-tracking branch 'mywork/ximinez/lending-number' into ximinez/lending-XLS-66
* mywork/ximinez/lending-number: Add a distinction between a "valid" and a "representable" Number chore: Point xrpld symlink to rippled (6012) Catch up the consequences of Number changes Fix build error - avoid copy Add integer enforcement when converting to XRP/MPTAmount to Number Make all STNumber fields "soeDEFAULT" Add optional enforcement of valid integer range to Number
This commit is contained in:
@@ -28,12 +28,17 @@ public:
|
||||
/** Describes whether and how to enforce this number as an integer.
|
||||
*
|
||||
* - none: No enforcement. The value may vary freely. This is the default.
|
||||
* - weak: If the absolute value is greater than maxIntValue, valid() will
|
||||
* return false.
|
||||
* - strong: Assignment operations will throw if the absolute value is above
|
||||
* maxIntValue.
|
||||
* - compatible: If the absolute value is greater than maxIntValue, valid()
|
||||
* will return false. Needed for backward compatibility with XRP used in
|
||||
* AMMs, and available for functions that will do their own checking. This
|
||||
* is the default for automatic conversions from XRPAmount to Number.
|
||||
* - weak: Like compatible, plus, if the value is unrepresentable (larger
|
||||
* than maxMantissa), assignment and other operations will throw.
|
||||
* - strong: Like weak, plus, if the absolute value is invalid (larger than
|
||||
* maxIntValue), assignment and other operations will throw. This is the
|
||||
* defalut for automatic conversions from MPTAmount to Number.
|
||||
*/
|
||||
enum EnforceInteger { none, weak, strong };
|
||||
enum EnforceInteger { none, compatible, weak, strong };
|
||||
|
||||
private:
|
||||
using rep = std::int64_t;
|
||||
@@ -42,8 +47,7 @@ private:
|
||||
|
||||
// The enforcement setting is not serialized, and does not affect the
|
||||
// ledger. If not "none", the value is checked to be within the valid
|
||||
// integer range. With "strong", the checks will be made as automatic as
|
||||
// possible.
|
||||
// integer range. See the enum description for more detail.
|
||||
EnforceInteger enforceInteger_ = none;
|
||||
|
||||
public:
|
||||
@@ -53,8 +57,8 @@ public:
|
||||
constexpr static rep maxMantissa = minMantissa * 10 - 1;
|
||||
static_assert(maxMantissa == 9'999'999'999'999'999LL);
|
||||
|
||||
constexpr static rep maxIntValue = maxMantissa / 10;
|
||||
static_assert(maxIntValue == 999'999'999'999'999LL);
|
||||
constexpr static rep maxIntValue = maxMantissa / 100;
|
||||
static_assert(maxIntValue == 99'999'999'999'999LL);
|
||||
|
||||
// The range for the exponent when normalized
|
||||
constexpr static int minExponent = -32768;
|
||||
@@ -93,6 +97,15 @@ public:
|
||||
|
||||
bool
|
||||
valid() const noexcept;
|
||||
bool
|
||||
representable() const noexcept;
|
||||
/// Combines setIntegerEnforcement(EnforceInteger) and valid()
|
||||
bool
|
||||
valid(EnforceInteger enforce);
|
||||
/// Because this function is const, it should only be used for one-off
|
||||
/// checks
|
||||
bool
|
||||
valid(EnforceInteger enforce) const;
|
||||
|
||||
constexpr Number
|
||||
operator+() const noexcept;
|
||||
|
||||
Reference in New Issue
Block a user