mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 23:31:07 +00:00
Bound Unsigned when signed is not supported. (#6367)
* bound unsigned when necessary * convert more type to AtLeast32BitUnsigned * Update primitives/arithmetic/src/traits.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * doc refactor * line reorganize Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
b17ccf24a8
commit
44fb311f1f
@@ -134,7 +134,7 @@
|
||||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
|
||||
use frame_support::{Parameter, decl_module, decl_event, decl_storage, decl_error, ensure};
|
||||
use sp_runtime::traits::{Member, AtLeast32Bit, Zero, StaticLookup};
|
||||
use sp_runtime::traits::{Member, AtLeast32Bit, AtLeast32BitUnsigned, Zero, StaticLookup};
|
||||
use frame_system::{self as system, ensure_signed};
|
||||
use sp_runtime::traits::One;
|
||||
|
||||
@@ -144,7 +144,7 @@ pub trait Trait: frame_system::Trait {
|
||||
type Event: From<Event<Self>> + Into<<Self as frame_system::Trait>::Event>;
|
||||
|
||||
/// The units in which we record balances.
|
||||
type Balance: Member + Parameter + AtLeast32Bit + Default + Copy;
|
||||
type Balance: Member + Parameter + AtLeast32BitUnsigned + Default + Copy;
|
||||
|
||||
/// The arithmetic type of asset identifier.
|
||||
type AssetId: Parameter + AtLeast32Bit + Default + Copy;
|
||||
|
||||
@@ -170,7 +170,7 @@ use frame_support::{
|
||||
use sp_runtime::{
|
||||
RuntimeDebug, DispatchResult, DispatchError,
|
||||
traits::{
|
||||
Zero, AtLeast32Bit, StaticLookup, Member, CheckedAdd, CheckedSub,
|
||||
Zero, AtLeast32BitUnsigned, StaticLookup, Member, CheckedAdd, CheckedSub,
|
||||
MaybeSerializeDeserialize, Saturating, Bounded,
|
||||
},
|
||||
};
|
||||
@@ -180,7 +180,7 @@ pub use self::imbalances::{PositiveImbalance, NegativeImbalance};
|
||||
|
||||
pub trait Subtrait<I: Instance = DefaultInstance>: frame_system::Trait {
|
||||
/// The balance of an account.
|
||||
type Balance: Parameter + Member + AtLeast32Bit + Codec + Default + Copy +
|
||||
type Balance: Parameter + Member + AtLeast32BitUnsigned + Codec + Default + Copy +
|
||||
MaybeSerializeDeserialize + Debug;
|
||||
|
||||
/// The minimum amount required to keep an account open.
|
||||
@@ -192,7 +192,7 @@ pub trait Subtrait<I: Instance = DefaultInstance>: frame_system::Trait {
|
||||
|
||||
pub trait Trait<I: Instance = DefaultInstance>: frame_system::Trait {
|
||||
/// The balance of an account.
|
||||
type Balance: Parameter + Member + AtLeast32Bit + Codec + Default + Copy +
|
||||
type Balance: Parameter + Member + AtLeast32BitUnsigned + Codec + Default + Copy +
|
||||
MaybeSerializeDeserialize + Debug;
|
||||
|
||||
/// Handler for the unbalanced reduction when removing a dust account.
|
||||
|
||||
@@ -157,7 +157,7 @@ use codec::{Decode, Encode, HasCompact, Input, Output, Error as CodecError};
|
||||
use sp_runtime::{RuntimeDebug, DispatchResult, DispatchError};
|
||||
use sp_runtime::traits::{
|
||||
CheckedAdd, CheckedSub, MaybeSerializeDeserialize, Member, One, Saturating, AtLeast32Bit,
|
||||
Zero, Bounded,
|
||||
Zero, Bounded, AtLeast32BitUnsigned
|
||||
};
|
||||
|
||||
use sp_std::prelude::*;
|
||||
@@ -165,8 +165,9 @@ use sp_std::{cmp, result, fmt::Debug};
|
||||
use frame_support::{
|
||||
decl_event, decl_module, decl_storage, ensure, decl_error,
|
||||
traits::{
|
||||
Currency, ExistenceRequirement, Imbalance, LockIdentifier, LockableCurrency, ReservableCurrency,
|
||||
SignedImbalance, WithdrawReason, WithdrawReasons, TryDrop, BalanceStatus,
|
||||
Currency, ExistenceRequirement, Imbalance, LockIdentifier, LockableCurrency,
|
||||
ReservableCurrency, SignedImbalance, WithdrawReason, WithdrawReasons, TryDrop,
|
||||
BalanceStatus,
|
||||
},
|
||||
Parameter, StorageMap,
|
||||
};
|
||||
@@ -178,25 +179,15 @@ mod tests;
|
||||
pub use self::imbalances::{NegativeImbalance, PositiveImbalance};
|
||||
|
||||
pub trait Trait: frame_system::Trait {
|
||||
type Balance: Parameter
|
||||
+ Member
|
||||
+ AtLeast32Bit
|
||||
+ Default
|
||||
+ Copy
|
||||
+ MaybeSerializeDeserialize
|
||||
+ Debug;
|
||||
type Balance: Parameter + Member + AtLeast32BitUnsigned + Default + Copy + Debug +
|
||||
MaybeSerializeDeserialize;
|
||||
type AssetId: Parameter + Member + AtLeast32Bit + Default + Copy;
|
||||
type Event: From<Event<Self>> + Into<<Self as frame_system::Trait>::Event>;
|
||||
}
|
||||
|
||||
pub trait Subtrait: frame_system::Trait {
|
||||
type Balance: Parameter
|
||||
+ Member
|
||||
+ AtLeast32Bit
|
||||
+ Default
|
||||
+ Copy
|
||||
+ MaybeSerializeDeserialize
|
||||
+ Debug;
|
||||
type Balance: Parameter + Member + AtLeast32BitUnsigned + Default + Copy + Debug +
|
||||
MaybeSerializeDeserialize;
|
||||
type AssetId: Parameter + Member + AtLeast32Bit + Default + Copy;
|
||||
}
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ use pallet_session::historical::IdentificationTuple;
|
||||
use sp_runtime::{
|
||||
offchain::storage::StorageValueRef,
|
||||
RuntimeDebug,
|
||||
traits::{Convert, Member, Saturating, AtLeast32Bit}, Perbill,
|
||||
traits::{Convert, Member, Saturating, AtLeast32BitUnsigned}, Perbill,
|
||||
transaction_validity::{
|
||||
TransactionValidity, ValidTransaction, InvalidTransaction, TransactionSource,
|
||||
TransactionPriority,
|
||||
@@ -160,7 +160,7 @@ struct HeartbeatStatus<BlockNumber> {
|
||||
pub sent_at: BlockNumber,
|
||||
}
|
||||
|
||||
impl<BlockNumber: PartialEq + AtLeast32Bit + Copy> HeartbeatStatus<BlockNumber> {
|
||||
impl<BlockNumber: PartialEq + AtLeast32BitUnsigned + Copy> HeartbeatStatus<BlockNumber> {
|
||||
/// Returns true if heartbeat has been recently sent.
|
||||
///
|
||||
/// Parameters:
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
//! The staking rate in NPoS is the total amount of tokens staked by nominators and validators,
|
||||
//! divided by the total token supply.
|
||||
|
||||
use sp_runtime::{Perbill, traits::AtLeast32Bit, curve::PiecewiseLinear};
|
||||
use sp_runtime::{Perbill, traits::AtLeast32BitUnsigned, curve::PiecewiseLinear};
|
||||
|
||||
/// The total payout to all validators (and their nominators) per era and maximum payout.
|
||||
///
|
||||
@@ -34,7 +34,7 @@ pub fn compute_total_payout<N>(
|
||||
npos_token_staked: N,
|
||||
total_tokens: N,
|
||||
era_duration: u64
|
||||
) -> (N, N) where N: AtLeast32Bit + Clone {
|
||||
) -> (N, N) where N: AtLeast32BitUnsigned + Clone {
|
||||
// Milliseconds per year for the Julian year (365.25 days).
|
||||
const MILLISECONDS_PER_YEAR: u64 = 1000 * 3600 * 24 * 36525 / 100;
|
||||
|
||||
|
||||
@@ -306,8 +306,8 @@ use sp_runtime::{
|
||||
Percent, Perbill, PerU16, PerThing, RuntimeDebug, DispatchError,
|
||||
curve::PiecewiseLinear,
|
||||
traits::{
|
||||
Convert, Zero, StaticLookup, CheckedSub, Saturating, SaturatedConversion, AtLeast32Bit,
|
||||
Dispatchable,
|
||||
Convert, Zero, StaticLookup, CheckedSub, Saturating, SaturatedConversion,
|
||||
AtLeast32BitUnsigned, Dispatchable,
|
||||
},
|
||||
transaction_validity::{
|
||||
TransactionValidityError, TransactionValidity, ValidTransaction, InvalidTransaction,
|
||||
@@ -493,7 +493,7 @@ pub struct StakingLedger<AccountId, Balance: HasCompact> {
|
||||
|
||||
impl<
|
||||
AccountId,
|
||||
Balance: HasCompact + Copy + Saturating + AtLeast32Bit,
|
||||
Balance: HasCompact + Copy + Saturating + AtLeast32BitUnsigned,
|
||||
> StakingLedger<AccountId, Balance> {
|
||||
/// Remove entries from `unlocking` that are sufficiently old and reduce the
|
||||
/// total by the sum of their balances.
|
||||
@@ -544,7 +544,7 @@ impl<
|
||||
}
|
||||
|
||||
impl<AccountId, Balance> StakingLedger<AccountId, Balance> where
|
||||
Balance: AtLeast32Bit + Saturating + Copy,
|
||||
Balance: AtLeast32BitUnsigned + Saturating + Copy,
|
||||
{
|
||||
/// Slash the validator for a given amount of balance. This can grow the value
|
||||
/// of the slash in the case that the validator has less than `minimum_balance`
|
||||
|
||||
@@ -25,7 +25,7 @@ use sp_core::u32_trait::Value as U32;
|
||||
use sp_runtime::{
|
||||
RuntimeDebug, ConsensusEngineId, DispatchResult, DispatchError, traits::{
|
||||
MaybeSerializeDeserialize, AtLeast32Bit, Saturating, TrailingZeroInput, Bounded, Zero,
|
||||
BadOrigin
|
||||
BadOrigin, AtLeast32BitUnsigned
|
||||
},
|
||||
};
|
||||
use crate::dispatch::Parameter;
|
||||
@@ -788,7 +788,7 @@ pub enum SignedImbalance<B, P: Imbalance<B>>{
|
||||
impl<
|
||||
P: Imbalance<B, Opposite=N>,
|
||||
N: Imbalance<B, Opposite=P>,
|
||||
B: AtLeast32Bit + FullCodec + Copy + MaybeSerializeDeserialize + Debug + Default,
|
||||
B: AtLeast32BitUnsigned + FullCodec + Copy + MaybeSerializeDeserialize + Debug + Default,
|
||||
> SignedImbalance<B, P> {
|
||||
pub fn zero() -> Self {
|
||||
SignedImbalance::Positive(P::zero())
|
||||
@@ -851,7 +851,8 @@ impl<
|
||||
/// Abstraction over a fungible assets system.
|
||||
pub trait Currency<AccountId> {
|
||||
/// The balance of an account.
|
||||
type Balance: AtLeast32Bit + FullCodec + Copy + MaybeSerializeDeserialize + Debug + Default;
|
||||
type Balance: AtLeast32BitUnsigned + FullCodec + Copy + MaybeSerializeDeserialize + Debug +
|
||||
Default;
|
||||
|
||||
/// The opaque token type for an imbalance. This is returned by unbalanced operations
|
||||
/// and must be dealt with. It may be dropped but cannot be cloned.
|
||||
|
||||
@@ -136,7 +136,7 @@ use sp_runtime::{
|
||||
};
|
||||
use crate::dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo, DispatchError};
|
||||
use sp_runtime::traits::SaturatedConversion;
|
||||
use sp_arithmetic::{Perbill, traits::{BaseArithmetic, Saturating}};
|
||||
use sp_arithmetic::{Perbill, traits::{BaseArithmetic, Saturating, Unsigned}};
|
||||
use smallvec::{smallvec, SmallVec};
|
||||
|
||||
/// Re-export priority as type
|
||||
@@ -571,7 +571,7 @@ pub type WeightToFeeCoefficients<T> = SmallVec<[WeightToFeeCoefficient<T>; 4]>;
|
||||
/// An implementor should only implement the `polynomial` function.
|
||||
pub trait WeightToFeePolynomial {
|
||||
/// The type that is returned as result from polynomial evaluation.
|
||||
type Balance: BaseArithmetic + From<u32> + Copy;
|
||||
type Balance: BaseArithmetic + From<u32> + Copy + Unsigned;
|
||||
|
||||
/// Returns a polynomial that describes the weight to fee conversion.
|
||||
///
|
||||
@@ -611,7 +611,7 @@ pub trait WeightToFeePolynomial {
|
||||
pub struct IdentityFee<T>(sp_std::marker::PhantomData<T>);
|
||||
|
||||
impl<T> WeightToFeePolynomial for IdentityFee<T> where
|
||||
T: BaseArithmetic + From<u32> + Copy
|
||||
T: BaseArithmetic + From<u32> + Copy + Unsigned
|
||||
{
|
||||
type Balance = T;
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ use sp_runtime::{
|
||||
self, CheckEqual, AtLeast32Bit, Zero, Lookup, LookupError,
|
||||
SimpleBitOps, Hash, Member, MaybeDisplay, BadOrigin,
|
||||
MaybeSerialize, MaybeSerializeDeserialize, MaybeMallocSizeOf, StaticLookup, One, Bounded,
|
||||
Dispatchable,
|
||||
Dispatchable, AtLeast32BitUnsigned
|
||||
},
|
||||
offchain::storage_lock::BlockNumberProvider,
|
||||
};
|
||||
@@ -181,8 +181,9 @@ pub trait Trait: 'static + Eq + Clone {
|
||||
|
||||
/// The block number type used by the runtime.
|
||||
type BlockNumber:
|
||||
Parameter + Member + MaybeSerializeDeserialize + Debug + MaybeDisplay + AtLeast32Bit
|
||||
+ Default + Bounded + Copy + sp_std::hash::Hash + sp_std::str::FromStr + MaybeMallocSizeOf;
|
||||
Parameter + Member + MaybeSerializeDeserialize + Debug + MaybeDisplay +
|
||||
AtLeast32BitUnsigned + Default + Bounded + Copy + sp_std::hash::Hash +
|
||||
sp_std::str::FromStr + MaybeMallocSizeOf;
|
||||
|
||||
/// The output of the `Hashing` function.
|
||||
type Hash:
|
||||
|
||||
@@ -51,7 +51,7 @@ use sp_std::prelude::*;
|
||||
use sp_std::fmt::Debug;
|
||||
use codec::{Encode, Decode};
|
||||
use sp_runtime::{DispatchResult, RuntimeDebug, traits::{
|
||||
StaticLookup, Zero, AtLeast32Bit, MaybeSerializeDeserialize, Convert
|
||||
StaticLookup, Zero, AtLeast32BitUnsigned, MaybeSerializeDeserialize, Convert
|
||||
}};
|
||||
use frame_support::{decl_module, decl_event, decl_storage, decl_error, ensure};
|
||||
use frame_support::traits::{
|
||||
@@ -92,8 +92,8 @@ pub struct VestingInfo<Balance, BlockNumber> {
|
||||
}
|
||||
|
||||
impl<
|
||||
Balance: AtLeast32Bit + Copy,
|
||||
BlockNumber: AtLeast32Bit + Copy,
|
||||
Balance: AtLeast32BitUnsigned + Copy,
|
||||
BlockNumber: AtLeast32BitUnsigned + Copy,
|
||||
> VestingInfo<Balance, BlockNumber> {
|
||||
/// Amount locked at block `n`.
|
||||
pub fn locked_at<
|
||||
|
||||
@@ -94,7 +94,7 @@ pub trait PerThing:
|
||||
/// ```
|
||||
fn mul_floor<N>(self, b: N) -> N
|
||||
where N: Clone + From<Self::Inner> + UniqueSaturatedInto<Self::Inner> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N>
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Unsigned
|
||||
{
|
||||
overflow_prune_mul::<N, Self>(b, self.deconstruct(), Rounding::Down)
|
||||
}
|
||||
@@ -116,7 +116,7 @@ pub trait PerThing:
|
||||
/// ```
|
||||
fn mul_ceil<N>(self, b: N) -> N
|
||||
where N: Clone + From<Self::Inner> + UniqueSaturatedInto<Self::Inner> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N>
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Unsigned
|
||||
{
|
||||
overflow_prune_mul::<N, Self>(b, self.deconstruct(), Rounding::Up)
|
||||
}
|
||||
@@ -132,7 +132,8 @@ pub trait PerThing:
|
||||
/// ```
|
||||
fn saturating_reciprocal_mul<N>(self, b: N) -> N
|
||||
where N: Clone + From<Self::Inner> + UniqueSaturatedInto<Self::Inner> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Saturating
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Saturating +
|
||||
Unsigned
|
||||
{
|
||||
saturating_reciprocal_mul::<N, Self>(b, self.deconstruct(), Rounding::Nearest)
|
||||
}
|
||||
@@ -151,7 +152,8 @@ pub trait PerThing:
|
||||
/// ```
|
||||
fn saturating_reciprocal_mul_floor<N>(self, b: N) -> N
|
||||
where N: Clone + From<Self::Inner> + UniqueSaturatedInto<Self::Inner> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Saturating
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Saturating +
|
||||
Unsigned
|
||||
{
|
||||
saturating_reciprocal_mul::<N, Self>(b, self.deconstruct(), Rounding::Down)
|
||||
}
|
||||
@@ -170,7 +172,8 @@ pub trait PerThing:
|
||||
/// ```
|
||||
fn saturating_reciprocal_mul_ceil<N>(self, b: N) -> N
|
||||
where N: Clone + From<Self::Inner> + UniqueSaturatedInto<Self::Inner> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Saturating
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Saturating +
|
||||
Unsigned
|
||||
{
|
||||
saturating_reciprocal_mul::<N, Self>(b, self.deconstruct(), Rounding::Up)
|
||||
}
|
||||
@@ -198,14 +201,14 @@ pub trait PerThing:
|
||||
/// # fn main () {
|
||||
/// // 989/100 is technically closer to 99%.
|
||||
/// assert_eq!(
|
||||
/// Percent::from_rational_approximation(989, 1000),
|
||||
/// Percent::from_rational_approximation(989u64, 1000),
|
||||
/// Percent::from_parts(98),
|
||||
/// );
|
||||
/// # }
|
||||
/// ```
|
||||
fn from_rational_approximation<N>(p: N, q: N) -> Self
|
||||
where N: Clone + Ord + From<Self::Inner> + TryInto<Self::Inner> + TryInto<Self::Upper> +
|
||||
ops::Div<N, Output=N> + ops::Rem<N, Output=N> + ops::Add<N, Output=N>;
|
||||
ops::Div<N, Output=N> + ops::Rem<N, Output=N> + ops::Add<N, Output=N> + Unsigned;
|
||||
}
|
||||
|
||||
/// The rounding method to use.
|
||||
@@ -227,7 +230,7 @@ fn saturating_reciprocal_mul<N, P>(
|
||||
) -> N
|
||||
where
|
||||
N: Clone + From<P::Inner> + UniqueSaturatedInto<P::Inner> + ops::Div<N, Output=N> + ops::Mul<N,
|
||||
Output=N> + ops::Add<N, Output=N> + ops::Rem<N, Output=N> + Saturating,
|
||||
Output=N> + ops::Add<N, Output=N> + ops::Rem<N, Output=N> + Saturating + Unsigned,
|
||||
P: PerThing,
|
||||
{
|
||||
let maximum: N = P::ACCURACY.into();
|
||||
@@ -248,7 +251,7 @@ fn overflow_prune_mul<N, P>(
|
||||
) -> N
|
||||
where
|
||||
N: Clone + From<P::Inner> + UniqueSaturatedInto<P::Inner> + ops::Div<N, Output=N> + ops::Mul<N,
|
||||
Output=N> + ops::Add<N, Output=N> + ops::Rem<N, Output=N>,
|
||||
Output=N> + ops::Add<N, Output=N> + ops::Rem<N, Output=N> + Unsigned,
|
||||
P: PerThing,
|
||||
{
|
||||
let maximum: N = P::ACCURACY.into();
|
||||
@@ -274,7 +277,7 @@ fn rational_mul_correction<N, P>(
|
||||
) -> N
|
||||
where
|
||||
N: From<P::Inner> + UniqueSaturatedInto<P::Inner> + ops::Div<N, Output=N> + ops::Mul<N,
|
||||
Output=N> + ops::Add<N, Output=N> + ops::Rem<N, Output=N>,
|
||||
Output=N> + ops::Add<N, Output=N> + ops::Rem<N, Output=N> + Unsigned,
|
||||
P: PerThing,
|
||||
{
|
||||
let numer_upper = P::Upper::from(numer);
|
||||
@@ -335,14 +338,15 @@ macro_rules! implement_per_thing {
|
||||
/// Build this type from a number of parts per thing.
|
||||
fn from_parts(parts: Self::Inner) -> Self { Self(parts.min($max)) }
|
||||
|
||||
/// NOTE: saturate to 0 or 1 if x is beyond `[0, 1]`
|
||||
#[cfg(feature = "std")]
|
||||
fn from_fraction(x: f64) -> Self {
|
||||
Self::from_parts((x * $max as f64) as Self::Inner)
|
||||
Self::from_parts((x.max(0.).min(1.) * $max as f64) as Self::Inner)
|
||||
}
|
||||
|
||||
fn from_rational_approximation<N>(p: N, q: N) -> Self
|
||||
where N: Clone + Ord + From<Self::Inner> + TryInto<Self::Inner> + TryInto<Self::Upper>
|
||||
+ ops::Div<N, Output=N> + ops::Rem<N, Output=N> + ops::Add<N, Output=N>
|
||||
+ ops::Div<N, Output=N> + ops::Rem<N, Output=N> + ops::Add<N, Output=N> + Unsigned
|
||||
{
|
||||
let div_ceil = |x: N, f: N| -> N {
|
||||
let mut o = x.clone() / f.clone();
|
||||
@@ -445,7 +449,8 @@ macro_rules! implement_per_thing {
|
||||
pub fn from_rational_approximation<N>(p: N, q: N) -> Self
|
||||
where N: Clone + Ord + From<$type> + TryInto<$type> +
|
||||
TryInto<$upper_type> + ops::Div<N, Output=N> + ops::Rem<N, Output=N> +
|
||||
ops::Add<N, Output=N> {
|
||||
ops::Add<N, Output=N> + Unsigned
|
||||
{
|
||||
<Self as PerThing>::from_rational_approximation(p, q)
|
||||
}
|
||||
|
||||
@@ -453,7 +458,8 @@ macro_rules! implement_per_thing {
|
||||
pub fn mul_floor<N>(self, b: N) -> N
|
||||
where N: Clone + From<$type> + UniqueSaturatedInto<$type> +
|
||||
ops::Rem<N, Output=N> + ops::Div<N, Output=N> + ops::Mul<N, Output=N> +
|
||||
ops::Add<N, Output=N> {
|
||||
ops::Add<N, Output=N> + Unsigned
|
||||
{
|
||||
PerThing::mul_floor(self, b)
|
||||
}
|
||||
|
||||
@@ -461,7 +467,8 @@ macro_rules! implement_per_thing {
|
||||
pub fn mul_ceil<N>(self, b: N) -> N
|
||||
where N: Clone + From<$type> + UniqueSaturatedInto<$type> +
|
||||
ops::Rem<N, Output=N> + ops::Div<N, Output=N> + ops::Mul<N, Output=N> +
|
||||
ops::Add<N, Output=N> {
|
||||
ops::Add<N, Output=N> + Unsigned
|
||||
{
|
||||
PerThing::mul_ceil(self, b)
|
||||
}
|
||||
|
||||
@@ -469,7 +476,8 @@ macro_rules! implement_per_thing {
|
||||
pub fn saturating_reciprocal_mul<N>(self, b: N) -> N
|
||||
where N: Clone + From<$type> + UniqueSaturatedInto<$type> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> +
|
||||
Saturating {
|
||||
Saturating + Unsigned
|
||||
{
|
||||
PerThing::saturating_reciprocal_mul(self, b)
|
||||
}
|
||||
|
||||
@@ -477,7 +485,8 @@ macro_rules! implement_per_thing {
|
||||
pub fn saturating_reciprocal_mul_floor<N>(self, b: N) -> N
|
||||
where N: Clone + From<$type> + UniqueSaturatedInto<$type> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> +
|
||||
Saturating {
|
||||
Saturating + Unsigned
|
||||
{
|
||||
PerThing::saturating_reciprocal_mul_floor(self, b)
|
||||
}
|
||||
|
||||
@@ -485,7 +494,8 @@ macro_rules! implement_per_thing {
|
||||
pub fn saturating_reciprocal_mul_ceil<N>(self, b: N) -> N
|
||||
where N: Clone + From<$type> + UniqueSaturatedInto<$type> + ops::Rem<N, Output=N> +
|
||||
ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> +
|
||||
Saturating {
|
||||
Saturating + Unsigned
|
||||
{
|
||||
PerThing::saturating_reciprocal_mul_ceil(self, b)
|
||||
}
|
||||
}
|
||||
@@ -585,7 +595,7 @@ macro_rules! implement_per_thing {
|
||||
impl<N> ops::Mul<N> for $name
|
||||
where
|
||||
N: Clone + From<$type> + UniqueSaturatedInto<$type> + ops::Rem<N, Output=N>
|
||||
+ ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N>,
|
||||
+ ops::Div<N, Output=N> + ops::Mul<N, Output=N> + ops::Add<N, Output=N> + Unsigned,
|
||||
{
|
||||
type Output = N;
|
||||
fn mul(self, b: N) -> Self::Output {
|
||||
@@ -684,6 +694,8 @@ macro_rules! implement_per_thing {
|
||||
assert_eq!($name::from_fraction(0.0), $name::from_parts(Zero::zero()));
|
||||
assert_eq!($name::from_fraction(0.1), $name::from_parts($max / 10));
|
||||
assert_eq!($name::from_fraction(1.0), $name::from_parts($max));
|
||||
assert_eq!($name::from_fraction(2.0), $name::from_parts($max));
|
||||
assert_eq!($name::from_fraction(-1.0), $name::from_parts(Zero::zero()));
|
||||
}
|
||||
|
||||
macro_rules! u256ify {
|
||||
|
||||
@@ -79,6 +79,11 @@ pub trait AtLeast32Bit: BaseArithmetic + From<u16> + From<u32> {}
|
||||
|
||||
impl<T: BaseArithmetic + From<u16> + From<u32>> AtLeast32Bit for T {}
|
||||
|
||||
/// A meta trait for arithmetic. Same as [`AtLeast32Bit `], but also bounded to be unsigned.
|
||||
pub trait AtLeast32BitUnsigned: AtLeast32Bit + Unsigned {}
|
||||
|
||||
impl<T: AtLeast32Bit + Unsigned> AtLeast32BitUnsigned for T {}
|
||||
|
||||
/// Just like `From` except that if the source value is too big to fit into the destination type
|
||||
/// then it'll saturate the destination.
|
||||
pub trait UniqueSaturatedFrom<T: Sized>: Sized {
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
//! Provides some utilities to define a piecewise linear function.
|
||||
|
||||
use crate::{Perbill, traits::{AtLeast32Bit, SaturatedConversion}};
|
||||
use crate::{Perbill, traits::{AtLeast32BitUnsigned, SaturatedConversion}};
|
||||
use core::ops::Sub;
|
||||
|
||||
/// Piecewise Linear function in [0, 1] -> [0, 1].
|
||||
@@ -36,7 +36,7 @@ fn abs_sub<N: Ord + Sub<Output=N> + Clone>(a: N, b: N) -> N where {
|
||||
impl<'a> PiecewiseLinear<'a> {
|
||||
/// Compute `f(n/d)*d` with `n <= d`. This is useful to avoid loss of precision.
|
||||
pub fn calculate_for_fraction_times_denominator<N>(&self, n: N, d: N) -> N where
|
||||
N: AtLeast32Bit + Clone
|
||||
N: AtLeast32BitUnsigned + Clone
|
||||
{
|
||||
let n = n.min(d.clone());
|
||||
|
||||
@@ -80,7 +80,7 @@ impl<'a> PiecewiseLinear<'a> {
|
||||
// This is guaranteed not to overflow on whatever values nor lose precision.
|
||||
// `q` must be superior to zero.
|
||||
fn multiply_by_rational_saturating<N>(value: N, p: u32, q: u32) -> N
|
||||
where N: AtLeast32Bit + Clone
|
||||
where N: AtLeast32BitUnsigned + Clone
|
||||
{
|
||||
let q = q.max(1);
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef, Error};
|
||||
use crate::traits::{
|
||||
self, Member, AtLeast32Bit, SimpleBitOps, Hash as HashT,
|
||||
self, Member, AtLeast32BitUnsigned, SimpleBitOps, Hash as HashT,
|
||||
MaybeSerializeDeserialize, MaybeSerialize, MaybeDisplay,
|
||||
MaybeMallocSizeOf,
|
||||
};
|
||||
@@ -123,7 +123,7 @@ impl<Number, Hash> codec::EncodeLike for Header<Number, Hash> where
|
||||
|
||||
impl<Number, Hash> traits::Header for Header<Number, Hash> where
|
||||
Number: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + MaybeDisplay +
|
||||
AtLeast32Bit + Codec + Copy + Into<U256> + TryFrom<U256> + sp_std::str::FromStr +
|
||||
AtLeast32BitUnsigned + Codec + Copy + Into<U256> + TryFrom<U256> + sp_std::str::FromStr +
|
||||
MaybeMallocSizeOf,
|
||||
Hash: HashT,
|
||||
Hash::Output: Default + sp_std::hash::Hash + Copy + Member + Ord +
|
||||
@@ -171,7 +171,8 @@ impl<Number, Hash> traits::Header for Header<Number, Hash> where
|
||||
}
|
||||
|
||||
impl<Number, Hash> Header<Number, Hash> where
|
||||
Number: Member + sp_std::hash::Hash + Copy + MaybeDisplay + AtLeast32Bit + Codec + Into<U256> + TryFrom<U256>,
|
||||
Number: Member + sp_std::hash::Hash + Copy + MaybeDisplay + AtLeast32BitUnsigned + Codec +
|
||||
Into<U256> + TryFrom<U256>,
|
||||
Hash: HashT,
|
||||
Hash::Output: Default + sp_std::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec,
|
||||
{
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
//! ```
|
||||
|
||||
use crate::offchain::storage::StorageValueRef;
|
||||
use crate::traits::AtLeast32Bit;
|
||||
use crate::traits::AtLeast32BitUnsigned;
|
||||
use codec::{Codec, Decode, Encode};
|
||||
use sp_core::offchain::{Duration, Timestamp};
|
||||
use sp_io::offchain;
|
||||
@@ -430,7 +430,7 @@ where
|
||||
/// used with [`BlockAndTime<BlockNumberProvider>`](BlockAndTime).
|
||||
pub trait BlockNumberProvider {
|
||||
/// Type of `BlockNumber` to provide.
|
||||
type BlockNumber: Codec + Clone + Ord + Eq + AtLeast32Bit;
|
||||
type BlockNumber: Codec + Clone + Ord + Eq + AtLeast32BitUnsigned;
|
||||
/// Returns the current block number.
|
||||
///
|
||||
/// Provides an abstraction over an arbitrary way of providing the
|
||||
|
||||
@@ -34,8 +34,8 @@ use crate::transaction_validity::{
|
||||
};
|
||||
use crate::generic::{Digest, DigestItem};
|
||||
pub use sp_arithmetic::traits::{
|
||||
AtLeast32Bit, UniqueSaturatedInto, UniqueSaturatedFrom, Saturating, SaturatedConversion,
|
||||
Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv,
|
||||
AtLeast32Bit, AtLeast32BitUnsigned, UniqueSaturatedInto, UniqueSaturatedFrom, Saturating,
|
||||
SaturatedConversion, Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv,
|
||||
CheckedShl, CheckedShr, IntegerSquareRoot
|
||||
};
|
||||
use sp_application_crypto::AppKey;
|
||||
@@ -490,9 +490,8 @@ pub trait Header:
|
||||
MaybeMallocSizeOf + 'static
|
||||
{
|
||||
/// Header number.
|
||||
type Number: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash
|
||||
+ Copy + MaybeDisplay + AtLeast32Bit + Codec + sp_std::str::FromStr
|
||||
+ MaybeMallocSizeOf;
|
||||
type Number: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + Copy +
|
||||
MaybeDisplay + AtLeast32BitUnsigned + Codec + sp_std::str::FromStr + MaybeMallocSizeOf;
|
||||
/// Header hash type
|
||||
type Hash: Member + MaybeSerializeDeserialize + Debug + sp_std::hash::Hash + Ord
|
||||
+ Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]>
|
||||
|
||||
Reference in New Issue
Block a user