use crate::TryNewError;
use core::fmt::{Binary, Debug, Display, LowerHex, Octal, UpperHex};
use core::ops::{
Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign,
Mul, MulAssign, Neg, Not, Sub, SubAssign,
};
pub(crate) mod sealed {
pub trait Sealed {}
}
pub trait BuiltinInteger: sealed::Sealed {}
pub trait Integer:
Sized
+ Copy
+ Clone
+ PartialOrd
+ Ord
+ PartialEq
+ Eq
+ Debug
+ Display
+ LowerHex
+ UpperHex
+ Octal
+ Binary
+ sealed::Sealed
+ Add<Self, Output = Self>
+ AddAssign<Self>
+ Sub<Self, Output = Self>
+ SubAssign<Self>
+ Div<Self, Output = Self>
+ DivAssign<Self>
+ Mul<Self, Output = Self>
+ MulAssign<Self>
+ Not<Output = Self>
+ BitAnd<Self, Output = Self>
+ BitAndAssign<Self>
+ BitOr<Self, Output = Self>
+ BitOrAssign<Self>
+ BitXor<Self, Output = Self>
+ BitXorAssign<Self>
{
type UnderlyingType: Integer
+ BuiltinInteger
+ Debug
+ TryFrom<u8>
+ TryFrom<u16>
+ TryFrom<u32>
+ TryFrom<u64>
+ TryFrom<u128>;
type UnsignedInteger: UnsignedInteger;
type SignedInteger: SignedInteger;
const BITS: usize;
const ZERO: Self;
const MIN: Self;
const MAX: Self;
const IS_SIGNED: bool;
fn new(value: Self::UnderlyingType) -> Self;
fn try_new(value: Self::UnderlyingType) -> Result<Self, TryNewError>;
fn value(self) -> Self::UnderlyingType;
fn from_<T: Integer>(value: T) -> Self;
fn masked_new<T: Integer>(value: T) -> Self;
fn as_u8(self) -> u8;
fn as_u16(self) -> u16;
fn as_u32(self) -> u32;
fn as_u64(self) -> u64;
fn as_u128(self) -> u128;
fn as_usize(self) -> usize;
fn as_i8(self) -> i8;
fn as_i16(self) -> i16;
fn as_i32(self) -> i32;
fn as_i64(self) -> i64;
fn as_i128(self) -> i128;
fn as_isize(self) -> isize;
fn to_unsigned(self) -> Self::UnsignedInteger;
fn from_unsigned(value: Self::UnsignedInteger) -> Self;
#[inline]
fn as_<T: Integer>(self) -> T {
T::masked_new(self)
}
}
pub trait SignedInteger: Integer + Neg<Output = Self> {}
pub trait UnsignedInteger: Integer {}