use crate::sealed::Sealed;
use core::marker::PhantomData;
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B0<H>(pub PhantomData<H>);
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B1<H>(pub PhantomData<H>);
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct Z0;
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct P1;
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct N1;
impl<H> Default for B0<H>{
fn default() -> Self{
B0(PhantomData)
}
}
impl<H> Default for B1<H>{
fn default() -> Self{
B1(PhantomData)
}
}
impl<H> Sealed for B0<H> {}
impl<H> Sealed for B1<H> {}
impl Sealed for Z0 {}
impl Sealed for P1 {}
impl Sealed for N1 {}
pub trait Integer: Default+Sealed + Copy + Default + 'static {
fn to_i32() -> i32;}
pub trait NonZero: Integer {}
pub trait NonOne: Integer {}
pub trait NonNegOne: Integer {}
pub trait Unsigned: Integer {}
impl NonZero for P1 {}
impl NonZero for N1 {}
impl<H: NonZero> NonZero for B0<H> {}
impl<H: NonZero> NonZero for B1<H> {}
impl Integer for Z0 {
#[inline(always)]
fn to_i32() -> i32 {
0
}
}
impl Integer for P1 {
#[inline(always)]
fn to_i32() -> i32 {
1
}
}
impl Integer for N1 {
#[inline(always)]
fn to_i32() -> i32 {
-1
}
}
impl<H: NonZero> Integer for B0<H> {
#[inline(always)]
fn to_i32() -> i32 {
H::to_i32() * 2
}
}
impl<H: NonZero> Integer for B1<H> {
#[inline(always)]
fn to_i32() -> i32 {
H::to_i32() * 2 + 1
}
}
impl NonOne for Z0 {}
impl NonOne for N1 {}
impl<H: NonZero> NonOne for B0<H> {}
impl<H: NonZero> NonOne for B1<H> {}
impl NonNegOne for Z0 {}
impl NonNegOne for P1 {}
impl<H: NonZero> NonNegOne for B0<H> {}
impl<H: NonZero> NonNegOne for B1<H> {}
impl Unsigned for Z0 {}
impl Unsigned for P1 {}
impl<H: NonZero + NonNegOne> Unsigned for B0<H> {}
impl<H: NonZero + NonNegOne> Unsigned for B1<H> {}
impl<H> B0<H> {
#[inline]
pub fn new() -> Self {
B0(PhantomData)
}
}
impl<H> B1<H> {
#[inline]
pub fn new() -> Self {
B1(PhantomData)
}
}
impl P1 {
#[inline]
pub fn new() -> Self {
P1
}
}
impl N1 {
#[inline]
pub fn new() -> Self {
N1
}
}
impl Z0 {
#[inline]
pub fn new() -> Self {
Z0
}
}