spongefish/drivers/
p3_koala_bear.rs1use p3_field::PrimeField32;
3use p3_koala_bear::KoalaBear;
4
5use crate::{
6 codecs::{Decoding, Encoding},
7 io::NargDeserialize,
8 VerificationError, VerificationResult,
9};
10
11const KOALABEAR_ZERO: KoalaBear = unsafe { core::mem::transmute(0u32) };
12
13impl crate::Unit for KoalaBear {
15 const ZERO: Self = KOALABEAR_ZERO;
16}
17
18impl Decoding<[u8]> for KoalaBear {
28 type Repr = [u8; 8];
29
30 fn decode(buf: Self::Repr) -> Self {
31 let n = u64::from_le_bytes(buf);
32 Self::new((n % u64::from(Self::ORDER_U32)) as u32)
33 }
34}
35
36impl NargDeserialize for KoalaBear {
38 fn deserialize_from_narg(buf: &mut &[u8]) -> VerificationResult<Self> {
39 if buf.len() < 4 {
40 return Err(VerificationError);
41 }
42 let mut repr = [0u8; 4];
43 repr.copy_from_slice(&buf[..4]);
44 let value = u32::from_be_bytes(repr);
45
46 if value >= Self::ORDER_U32 {
48 return Err(VerificationError);
49 }
50
51 *buf = &buf[4..];
52 Ok(Self::new(value))
53 }
54}
55
56impl Encoding<[u8]> for KoalaBear {
58 fn encode(&self) -> impl AsRef<[u8]> {
59 self.as_canonical_u32().to_be_bytes()
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use alloc::vec::Vec;
66
67 use super::*;
68 use crate::io::NargSerialize;
69
70 #[test]
71 fn test_koalabear_serialize_deserialize() {
72 let element = KoalaBear::new(12345);
74
75 let mut buf = Vec::new();
76 element.serialize_into_narg(&mut buf);
77
78 let deserialized = KoalaBear::deserialize_from_narg(&mut &buf[..]).unwrap();
79 assert_eq!(element, deserialized);
80 }
81
82 #[test]
83 fn test_koalabear_encoding() {
84 let element = KoalaBear::new(67890);
85
86 let encoded = element.encode();
87 let encoded_bytes = encoded.as_ref();
88
89 let deserialized = KoalaBear::deserialize_from_narg(&mut &encoded_bytes[..]).unwrap();
90 assert_eq!(element, deserialized);
91 }
92
93 #[test]
94 fn test_koalabear_out_of_range() {
95 let buf = KoalaBear::ORDER_U32.to_be_bytes();
97 let result = KoalaBear::deserialize_from_narg(&mut &buf[..]);
98 assert!(result.is_err());
99 }
100}