all Stacks

This commit is contained in:
Dmitry Vagner 2023-04-03 19:37:14 -07:00
parent 0e3b86def8
commit 4e48fc430f

View File

@ -1206,6 +1206,32 @@ pub trait Stack {
fn from_stack(stack: &[U256]) -> Self; fn from_stack(stack: &[U256]) -> Self;
} }
impl Stack for Fp6<BN254> {
fn to_stack(self) -> Vec<U256> {
let f: [U256; 6] = unsafe { transmute(self) };
f.into_iter().collect()
}
fn from_stack(stack: &[U256]) -> Self {
let mut f = [U256::zero(); 6];
f.copy_from_slice(stack);
unsafe { transmute(f) }
}
}
impl Stack for Fp12<BN254> {
fn to_stack(self) -> Vec<U256> {
let f: [U256; 12] = unsafe { transmute(self) };
f.into_iter().collect()
}
fn from_stack(stack: &[U256]) -> Self {
let mut f = [U256::zero(); 12];
f.copy_from_slice(stack);
unsafe { transmute(f) }
}
}
impl Stack for BLS381 { impl Stack for BLS381 {
fn to_stack(self) -> Vec<U256> { fn to_stack(self) -> Vec<U256> {
vec![self.lo(), self.hi()] vec![self.lo(), self.hi()]
@ -1233,28 +1259,32 @@ impl Stack for Fp2<BLS381> {
} }
} }
impl Stack for Fp6<BN254> { impl Stack for Fp6<BLS381> {
fn to_stack(self) -> Vec<U256> { fn to_stack(self) -> Vec<U256> {
let f: [U256; 6] = unsafe { transmute(self) }; let mut res = self.t0.to_stack();
f.into_iter().collect() res.extend(self.t1.to_stack());
res.extend(self.t2.to_stack());
res
} }
fn from_stack(stack: &[U256]) -> Self { fn from_stack(stack: &[U256]) -> Fp6<BLS381> {
let mut f = [U256::zero(); 6]; let t0 = Fp2::<BLS381>::from_stack(&stack[0..4]);
f.copy_from_slice(stack); let t1 = Fp2::<BLS381>::from_stack(&stack[4..8]);
unsafe { transmute(f) } let t2 = Fp2::<BLS381>::from_stack(&stack[8..12]);
Fp6 { t0, t1, t2 }
} }
} }
impl Stack for Fp12<BN254> { impl Stack for Fp12<BLS381> {
fn to_stack(self) -> Vec<U256> { fn to_stack(self) -> Vec<U256> {
let f: [U256; 12] = unsafe { transmute(self) }; let mut res = self.z0.to_stack();
f.into_iter().collect() res.extend(self.z1.to_stack());
res
} }
fn from_stack(stack: &[U256]) -> Self { fn from_stack(stack: &[U256]) -> Fp12<BLS381> {
let mut f = [U256::zero(); 12]; let z0 = Fp6::<BLS381>::from_stack(&stack[0..12]);
f.copy_from_slice(stack); let z1 = Fp6::<BLS381>::from_stack(&stack[12..24]);
unsafe { transmute(f) } Fp12 { z0, z1 }
} }
} }