mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 11:05:54 +00:00
Remove the new TenthBips serialized type
- It was a neat idea, but more trouble than it's worth. The conversion functions are sufficient for what I need. - Partially reverts - d7357d3eca0b70c36b5665fdf23ee5e7a3cea0d7 - cbb4dbcbe7023cb8a8d30f0e794acf9d1d9a458a - 396b981fc0da0d2d248b8c68bd3fac68c5f0b64c
This commit is contained in:
@@ -92,8 +92,6 @@ concept HasValue = requires(Integer i) { i.value(); };
|
|||||||
STYPE(STI_ISSUE, 24) \
|
STYPE(STI_ISSUE, 24) \
|
||||||
STYPE(STI_XCHAIN_BRIDGE, 25) \
|
STYPE(STI_XCHAIN_BRIDGE, 25) \
|
||||||
STYPE(STI_CURRENCY, 26) \
|
STYPE(STI_CURRENCY, 26) \
|
||||||
STYPE(STI_TENTHBIPS16, 27) \
|
|
||||||
STYPE(STI_TENTHBIPS32, 28) \
|
|
||||||
\
|
\
|
||||||
/* high-level types */ \
|
/* high-level types */ \
|
||||||
/* cannot be serialized inside other types */ \
|
/* cannot be serialized inside other types */ \
|
||||||
@@ -363,13 +361,6 @@ using SF_UINT256 = TypedField<STBitString<256>>;
|
|||||||
using SF_UINT384 = TypedField<STBitString<384>>;
|
using SF_UINT384 = TypedField<STBitString<384>>;
|
||||||
using SF_UINT512 = TypedField<STBitString<512>>;
|
using SF_UINT512 = TypedField<STBitString<512>>;
|
||||||
|
|
||||||
// These TENTHBIPS values are serialized as the underlying type.
|
|
||||||
// The tag is only applied when deserialized.
|
|
||||||
//
|
|
||||||
// Tenth of a basis point values:
|
|
||||||
using SF_TENTHBIPS16 = TypedField<STInteger<TenthBips16>>;
|
|
||||||
using SF_TENTHBIPS32 = TypedField<STInteger<TenthBips32>>;
|
|
||||||
|
|
||||||
using SF_ACCOUNT = TypedField<STAccount>;
|
using SF_ACCOUNT = TypedField<STAccount>;
|
||||||
using SF_AMOUNT = TypedField<STAmount>;
|
using SF_AMOUNT = TypedField<STAmount>;
|
||||||
using SF_ISSUE = TypedField<STIssue>;
|
using SF_ISSUE = TypedField<STIssue>;
|
||||||
|
|||||||
@@ -61,26 +61,6 @@ struct STExchange<STInteger<U>, T>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class U, class T>
|
|
||||||
struct STExchange<STInteger<TenthBips<U>>, T>
|
|
||||||
{
|
|
||||||
explicit STExchange() = default;
|
|
||||||
|
|
||||||
using value_type = TenthBips<U>;
|
|
||||||
|
|
||||||
static void
|
|
||||||
get(std::optional<T>& t, STInteger<value_type> const& u)
|
|
||||||
{
|
|
||||||
t = u.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::unique_ptr<STInteger<value_type>>
|
|
||||||
set(SField const& f, T const& t)
|
|
||||||
{
|
|
||||||
return std::make_unique<STInteger<value_type>>(f, t);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct STExchange<STBlob, Slice>
|
struct STExchange<STBlob, Slice>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -82,10 +82,6 @@ using STUInt16 = STInteger<std::uint16_t>;
|
|||||||
using STUInt32 = STInteger<std::uint32_t>;
|
using STUInt32 = STInteger<std::uint32_t>;
|
||||||
using STUInt64 = STInteger<std::uint64_t>;
|
using STUInt64 = STInteger<std::uint64_t>;
|
||||||
|
|
||||||
// Tenth of a basis point values:
|
|
||||||
using STTenthBips16 = STInteger<TenthBips16>;
|
|
||||||
using STTenthBips32 = STInteger<TenthBips32>;
|
|
||||||
|
|
||||||
template <typename Integer>
|
template <typename Integer>
|
||||||
inline STInteger<Integer>::STInteger(Integer v) : value_(v)
|
inline STInteger<Integer>::STInteger(Integer v) : value_(v)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -61,9 +61,7 @@ TYPED_SFIELD(sfHookEmitCount, UINT16, 18)
|
|||||||
TYPED_SFIELD(sfHookExecutionIndex, UINT16, 19)
|
TYPED_SFIELD(sfHookExecutionIndex, UINT16, 19)
|
||||||
TYPED_SFIELD(sfHookApiVersion, UINT16, 20)
|
TYPED_SFIELD(sfHookApiVersion, UINT16, 20)
|
||||||
TYPED_SFIELD(sfLedgerFixType, UINT16, 21)
|
TYPED_SFIELD(sfLedgerFixType, UINT16, 21)
|
||||||
|
TYPED_SFIELD(sfManagementFeeRate, UINT16, 22) // 1/10 basis points (bips)
|
||||||
// 16-bit integers represented as 1/10 basis points (bips)
|
|
||||||
TYPED_SFIELD(sfManagementFeeRate, TENTHBIPS16, 1)
|
|
||||||
|
|
||||||
// 32-bit integers (common)
|
// 32-bit integers (common)
|
||||||
TYPED_SFIELD(sfNetworkID, UINT32, 1)
|
TYPED_SFIELD(sfNetworkID, UINT32, 1)
|
||||||
@@ -126,15 +124,13 @@ TYPED_SFIELD(sfNextPaymentDueDate, UINT32, 56)
|
|||||||
TYPED_SFIELD(sfPaymentRemaining, UINT32, 57)
|
TYPED_SFIELD(sfPaymentRemaining, UINT32, 57)
|
||||||
TYPED_SFIELD(sfPaymentTotal, UINT32, 58)
|
TYPED_SFIELD(sfPaymentTotal, UINT32, 58)
|
||||||
TYPED_SFIELD(sfLoanSequence, UINT32, 59)
|
TYPED_SFIELD(sfLoanSequence, UINT32, 59)
|
||||||
|
TYPED_SFIELD(sfCoverRateMinimum, UINT32, 60) // 1/10 basis points (bips)
|
||||||
// 32-bit integers represented as 1/10 basis points (bips)
|
TYPED_SFIELD(sfCoverRateLiquidation, UINT32, 61) // 1/10 basis points (bips)
|
||||||
TYPED_SFIELD(sfCoverRateMinimum, TENTHBIPS32, 1)
|
TYPED_SFIELD(sfOverpaymentFee, UINT32, 62) // 1/10 basis points (bips)
|
||||||
TYPED_SFIELD(sfCoverRateLiquidation, TENTHBIPS32, 2)
|
TYPED_SFIELD(sfInterestRate, UINT32, 63) // 1/10 basis points (bips)
|
||||||
TYPED_SFIELD(sfOverpaymentFee, TENTHBIPS32, 3)
|
TYPED_SFIELD(sfLateInterestRate, UINT32, 64) // 1/10 basis points (bips)
|
||||||
TYPED_SFIELD(sfInterestRate, TENTHBIPS32, 4)
|
TYPED_SFIELD(sfCloseInterestRate, UINT32, 65) // 1/10 basis points (bips)
|
||||||
TYPED_SFIELD(sfLateInterestRate, TENTHBIPS32, 5)
|
TYPED_SFIELD(sfOverpaymentInterestRate, UINT32, 66) // 1/10 basis points (bips)
|
||||||
TYPED_SFIELD(sfCloseInterestRate, TENTHBIPS32, 6)
|
|
||||||
TYPED_SFIELD(sfOverpaymentInterestRate, TENTHBIPS32, 7)
|
|
||||||
|
|
||||||
// 64-bit integers (common)
|
// 64-bit integers (common)
|
||||||
TYPED_SFIELD(sfIndexNext, UINT64, 1)
|
TYPED_SFIELD(sfIndexNext, UINT64, 1)
|
||||||
|
|||||||
@@ -229,62 +229,4 @@ STUInt64::getJson(JsonOptions) const
|
|||||||
return convertToString(value_, 16); // Convert to base 16
|
return convertToString(value_, 16); // Convert to base 16
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
template <>
|
|
||||||
STTenthBips16::STInteger(SerialIter& sit, SField const& name)
|
|
||||||
: STInteger(name, TenthBips16(sit.get16()))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
SerializedTypeID
|
|
||||||
STTenthBips16::getSType() const
|
|
||||||
{
|
|
||||||
return STI_TENTHBIPS16;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
std::string
|
|
||||||
STTenthBips16::getText() const
|
|
||||||
{
|
|
||||||
return std::to_string(value_.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
Json::Value
|
|
||||||
STTenthBips16::getJson(JsonOptions) const
|
|
||||||
{
|
|
||||||
return value_.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
template <>
|
|
||||||
STTenthBips32::STInteger(SerialIter& sit, SField const& name)
|
|
||||||
: STInteger(name, TenthBips32(sit.get32()))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
SerializedTypeID
|
|
||||||
STTenthBips32::getSType() const
|
|
||||||
{
|
|
||||||
return STI_TENTHBIPS32;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
std::string
|
|
||||||
STTenthBips32::getText() const
|
|
||||||
{
|
|
||||||
return std::to_string(value_.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
Json::Value
|
|
||||||
STTenthBips32::getJson(JsonOptions) const
|
|
||||||
{
|
|
||||||
return value_.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|||||||
@@ -446,14 +446,6 @@ parseLeaf(
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STI_TENTHBIPS16:
|
|
||||||
ret = parseUnsigned<STTenthBips16, std::uint16_t>(
|
|
||||||
field, json_name, fieldName, name, value, error);
|
|
||||||
if (!ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STI_UINT32:
|
case STI_UINT32:
|
||||||
ret = parseUnsigned<STUInt32, std::uint32_t>(
|
ret = parseUnsigned<STUInt32, std::uint32_t>(
|
||||||
field, json_name, fieldName, name, value, error);
|
field, json_name, fieldName, name, value, error);
|
||||||
@@ -462,14 +454,6 @@ parseLeaf(
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STI_TENTHBIPS32:
|
|
||||||
ret = parseUnsigned<STTenthBips32, std::uint32_t>(
|
|
||||||
field, json_name, fieldName, name, value, error);
|
|
||||||
if (!ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STI_UINT64:
|
case STI_UINT64:
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -190,12 +190,6 @@ STVar::constructST(SerializedTypeID id, int depth, Args&&... args)
|
|||||||
case STI_UINT64:
|
case STI_UINT64:
|
||||||
construct<STUInt64>(std::forward<Args>(args)...);
|
construct<STUInt64>(std::forward<Args>(args)...);
|
||||||
return;
|
return;
|
||||||
case STI_TENTHBIPS16:
|
|
||||||
construct<STTenthBips16>(std::forward<Args>(args)...);
|
|
||||||
return;
|
|
||||||
case STI_TENTHBIPS32:
|
|
||||||
construct<STTenthBips32>(std::forward<Args>(args)...);
|
|
||||||
return;
|
|
||||||
case STI_AMOUNT:
|
case STI_AMOUNT:
|
||||||
construct<STAmount>(std::forward<Args>(args)...);
|
construct<STAmount>(std::forward<Args>(args)...);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -197,9 +197,7 @@ struct valueUnitField
|
|||||||
using OV = ValueType;
|
using OV = ValueType;
|
||||||
using base = JTxField<SF, SV, OV>;
|
using base = JTxField<SF, SV, OV>;
|
||||||
|
|
||||||
static_assert(std::is_same_v<SV, typename SField::type::value_type>);
|
static_assert(std::is_same_v<OV, typename SField::type::value_type>);
|
||||||
static_assert(
|
|
||||||
std::is_same_v<OV, typename SField::type::value_type::value_type>);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
using base::value_;
|
using base::value_;
|
||||||
@@ -273,8 +271,8 @@ public:
|
|||||||
|
|
||||||
template <
|
template <
|
||||||
class SField,
|
class SField,
|
||||||
class UnitTag = typename SField::type::value_type::unit_type,
|
class UnitTag,
|
||||||
class ValueType = typename SField::type::value_type::value_type>
|
class ValueType = typename SField::type::value_type>
|
||||||
using valueUnitWrapper =
|
using valueUnitWrapper =
|
||||||
JTxFieldWrapper<valueUnitField<SField, UnitTag, ValueType>>;
|
JTxFieldWrapper<valueUnitField<SField, UnitTag, ValueType>>;
|
||||||
|
|
||||||
@@ -687,15 +685,15 @@ coverWithdraw(
|
|||||||
auto const loanBrokerID = JTxFieldWrapper<uint256Field>(sfLoanBrokerID);
|
auto const loanBrokerID = JTxFieldWrapper<uint256Field>(sfLoanBrokerID);
|
||||||
|
|
||||||
auto const managementFeeRate =
|
auto const managementFeeRate =
|
||||||
valueUnitWrapper<SF_TENTHBIPS16>(sfManagementFeeRate);
|
valueUnitWrapper<SF_UINT16, unit::TenthBipsTag>(sfManagementFeeRate);
|
||||||
|
|
||||||
auto const debtMaximum = simpleField<SF_NUMBER>(sfDebtMaximum);
|
auto const debtMaximum = simpleField<SF_NUMBER>(sfDebtMaximum);
|
||||||
|
|
||||||
auto const coverRateMinimum =
|
auto const coverRateMinimum =
|
||||||
valueUnitWrapper<SF_TENTHBIPS32>(sfCoverRateMinimum);
|
valueUnitWrapper<SF_UINT32, unit::TenthBipsTag>(sfCoverRateMinimum);
|
||||||
|
|
||||||
auto const coverRateLiquidation =
|
auto const coverRateLiquidation =
|
||||||
valueUnitWrapper<SF_TENTHBIPS32>(sfCoverRateLiquidation);
|
valueUnitWrapper<SF_UINT32, unit::TenthBipsTag>(sfCoverRateLiquidation);
|
||||||
|
|
||||||
} // namespace loanBroker
|
} // namespace loanBroker
|
||||||
|
|
||||||
@@ -722,18 +720,20 @@ auto const latePaymentFee = simpleField<SF_NUMBER>(sfLatePaymentFee);
|
|||||||
|
|
||||||
auto const closePaymentFee = simpleField<SF_NUMBER>(sfClosePaymentFee);
|
auto const closePaymentFee = simpleField<SF_NUMBER>(sfClosePaymentFee);
|
||||||
|
|
||||||
auto const overpaymentFee = valueUnitWrapper<SF_TENTHBIPS32>(sfOverpaymentFee);
|
auto const overpaymentFee =
|
||||||
|
valueUnitWrapper<SF_UINT32, unit::TenthBipsTag>(sfOverpaymentFee);
|
||||||
|
|
||||||
auto const interestRate = valueUnitWrapper<SF_TENTHBIPS32>(sfInterestRate);
|
auto const interestRate =
|
||||||
|
valueUnitWrapper<SF_UINT32, unit::TenthBipsTag>(sfInterestRate);
|
||||||
|
|
||||||
auto const lateInterestRate =
|
auto const lateInterestRate =
|
||||||
valueUnitWrapper<SF_TENTHBIPS32>(sfLateInterestRate);
|
valueUnitWrapper<SF_UINT32, unit::TenthBipsTag>(sfLateInterestRate);
|
||||||
|
|
||||||
auto const closeInterestRate =
|
auto const closeInterestRate =
|
||||||
valueUnitWrapper<SF_TENTHBIPS32>(sfCloseInterestRate);
|
valueUnitWrapper<SF_UINT32, unit::TenthBipsTag>(sfCloseInterestRate);
|
||||||
|
|
||||||
auto const overpaymentInterestRate =
|
auto const overpaymentInterestRate =
|
||||||
valueUnitWrapper<SF_TENTHBIPS32>(sfOverpaymentInterestRate);
|
valueUnitWrapper<SF_UINT32, unit::TenthBipsTag>(sfOverpaymentInterestRate);
|
||||||
|
|
||||||
auto const paymentTotal = simpleField<SF_UINT32>(sfPaymentTotal);
|
auto const paymentTotal = simpleField<SF_UINT32>(sfPaymentTotal);
|
||||||
|
|
||||||
|
|||||||
@@ -1405,7 +1405,7 @@ class Invariants_test : public beast::unit_test::suite
|
|||||||
sle->at(sfOwner) = sle->at(sfAccount);
|
sle->at(sfOwner) = sle->at(sfAccount);
|
||||||
},
|
},
|
||||||
[](SLE::pointer& sle) {
|
[](SLE::pointer& sle) {
|
||||||
sle->at(sfManagementFeeRate) += TenthBips16(1);
|
sle->at(sfManagementFeeRate) += 1;
|
||||||
},
|
},
|
||||||
[](SLE::pointer& sle) { sle->at(sfCoverRateMinimum) += 1; },
|
[](SLE::pointer& sle) { sle->at(sfCoverRateMinimum) += 1; },
|
||||||
[](SLE::pointer& sle) {
|
[](SLE::pointer& sle) {
|
||||||
|
|||||||
@@ -111,7 +111,8 @@ LoanBrokerCoverWithdraw::preclaim(PreclaimContext const& ctx)
|
|||||||
auto const coverAvail = sleBroker->at(sfCoverAvailable);
|
auto const coverAvail = sleBroker->at(sfCoverAvailable);
|
||||||
// Cover Rate is in 1/10 bips units
|
// Cover Rate is in 1/10 bips units
|
||||||
auto const minimumCover = tenthBipsOfValue(
|
auto const minimumCover = tenthBipsOfValue(
|
||||||
sleBroker->at(sfDebtTotal), sleBroker->at(sfCoverRateMinimum));
|
sleBroker->at(sfDebtTotal),
|
||||||
|
TenthBips32(sleBroker->at(sfCoverRateMinimum)));
|
||||||
if (coverAvail < amount)
|
if (coverAvail < amount)
|
||||||
return tecINSUFFICIENT_FUNDS;
|
return tecINSUFFICIENT_FUNDS;
|
||||||
if ((coverAvail - amount) < minimumCover)
|
if ((coverAvail - amount) < minimumCover)
|
||||||
|
|||||||
@@ -229,7 +229,8 @@ LoanSet::preclaim(PreclaimContext const& ctx)
|
|||||||
}
|
}
|
||||||
if (brokerSle->at(sfCoverAvailable) <
|
if (brokerSle->at(sfCoverAvailable) <
|
||||||
tenthBipsOfValue(
|
tenthBipsOfValue(
|
||||||
debtTotal + principalRequested, brokerSle->at(sfCoverRateMinimum)))
|
debtTotal + principalRequested,
|
||||||
|
TenthBips32(brokerSle->at(sfCoverRateMinimum))))
|
||||||
{
|
{
|
||||||
JLOG(ctx.j.warn())
|
JLOG(ctx.j.warn())
|
||||||
<< "Insufficient first-loss capital to cover the loan.";
|
<< "Insufficient first-loss capital to cover the loan.";
|
||||||
@@ -270,7 +271,7 @@ LoanSet::doApply()
|
|||||||
auto const brokerPseudo = brokerSle->at(sfAccount);
|
auto const brokerPseudo = brokerSle->at(sfAccount);
|
||||||
auto const brokerPseudoSle = view.peek(keylet::account(brokerPseudo));
|
auto const brokerPseudoSle = view.peek(keylet::account(brokerPseudo));
|
||||||
auto const principalRequested = tx[sfPrincipalRequested];
|
auto const principalRequested = tx[sfPrincipalRequested];
|
||||||
auto const interestRate = tx[~sfInterestRate].value_or(TenthBips32(0));
|
TenthBips32 const interestRate{tx[~sfInterestRate].value_or(0)};
|
||||||
auto const originationFee = tx[~sfLoanOriginationFee];
|
auto const originationFee = tx[~sfLoanOriginationFee];
|
||||||
auto const loanAssetsAvailable =
|
auto const loanAssetsAvailable =
|
||||||
principalRequested - originationFee.value_or(Number{});
|
principalRequested - originationFee.value_or(Number{});
|
||||||
@@ -332,14 +333,14 @@ LoanSet::doApply()
|
|||||||
return ter;
|
return ter;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto const managementFeeRate = brokerSle->at(sfManagementFeeRate);
|
TenthBips32 const managementFeeRate{brokerSle->at(sfManagementFeeRate)};
|
||||||
// The total amount if interest the loan is expected to generate
|
// The total amount if interest the loan is expected to generate
|
||||||
auto const loanInterest =
|
auto const loanInterest =
|
||||||
tenthBipsOfValue(principalRequested, interestRate);
|
tenthBipsOfValue(principalRequested, interestRate);
|
||||||
// The portion of the loan interest that will go to the vault (total
|
// The portion of the loan interest that will go to the vault (total
|
||||||
// interest minus the management fee)
|
// interest minus the management fee)
|
||||||
auto const loanInterestToVault = loanInterest -
|
auto const loanInterestToVault =
|
||||||
tenthBipsOfValue(loanInterest, managementFeeRate.value());
|
loanInterest - tenthBipsOfValue(loanInterest, managementFeeRate);
|
||||||
auto const startDate = tx[sfStartDate];
|
auto const startDate = tx[sfStartDate];
|
||||||
auto const paymentInterval =
|
auto const paymentInterval =
|
||||||
tx[~sfPaymentInterval].value_or(defaultPaymentInterval);
|
tx[~sfPaymentInterval].value_or(defaultPaymentInterval);
|
||||||
|
|||||||
@@ -229,6 +229,13 @@ protected:
|
|||||||
static bool
|
static bool
|
||||||
validNumericRange(std::optional<T> value, T max, T min = {});
|
validNumericRange(std::optional<T> value, T max, T min = {});
|
||||||
|
|
||||||
|
template <class T, class Unit>
|
||||||
|
static bool
|
||||||
|
validNumericRange(
|
||||||
|
std::optional<T> value,
|
||||||
|
unit::ValueUnit<Unit, T> max,
|
||||||
|
unit::ValueUnit<Unit, T> min = {});
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::pair<TER, XRPAmount>
|
std::pair<TER, XRPAmount>
|
||||||
reset(XRPAmount fee);
|
reset(XRPAmount fee);
|
||||||
@@ -322,6 +329,16 @@ Transactor::validNumericRange(std::optional<T> value, T max, T min)
|
|||||||
return value >= min && value <= max;
|
return value >= min && value <= max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class T, class Unit>
|
||||||
|
bool
|
||||||
|
Transactor::validNumericRange(
|
||||||
|
std::optional<T> value,
|
||||||
|
unit::ValueUnit<Unit, T> max,
|
||||||
|
unit::ValueUnit<Unit, T> min)
|
||||||
|
{
|
||||||
|
return validNumericRange(value, max.value(), min.value());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user