Skip to content

Commit

Permalink
Add array serialization impls (#371)
Browse files Browse the repository at this point in the history
Co-authored-by: Pratyush Mishra <[email protected]>
  • Loading branch information
ryanleh and Pratyush authored Jan 7, 2022
1 parent 1ba7e07 commit edea6bb
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
- [\#312](https://github.com/arkworks-rs/algebra/pull/312) (ark-ec) Add `is_in_correct_subgroup_assuming_on_curve` for all `SWModelParameters`.
- [\#348](https://github.com/arkworks-rs/algebra/pull/348) (ark-ec) Add `msm:{Fixed,Variable}Base:msm_checked_len`.
- [\#364](https://github.com/arkworks-rs/algebra/pull/364) (ark-ec) Add `ChunkedPippenger` to variable-base MSM.
- [\#371](https://github.com/arkworks-rs/algebra/pull/371) (ark-serialize) Add serialization impls for arrays

### Improvements

Expand Down
78 changes: 71 additions & 7 deletions serialize/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,64 @@ impl<T: CanonicalSerialize> CanonicalSerialize for [T] {
}
}

impl<T: CanonicalSerialize, const N: usize> CanonicalSerialize for [T; N] {
#[inline]
fn serialize<W: Write>(&self, mut writer: W) -> Result<(), SerializationError> {
for item in self.iter() {
item.serialize(&mut writer)?;
}
Ok(())
}

#[inline]
fn serialized_size(&self) -> usize {
self.iter()
.map(|item| item.serialized_size())
.sum::<usize>()
}

#[inline]
fn serialize_uncompressed<W: Write>(&self, mut writer: W) -> Result<(), SerializationError> {
for item in self.iter() {
item.serialize_uncompressed(&mut writer)?;
}
Ok(())
}

#[inline]
fn serialize_unchecked<W: Write>(&self, mut writer: W) -> Result<(), SerializationError> {
for item in self.iter() {
item.serialize_unchecked(&mut writer)?;
}
Ok(())
}

#[inline]
fn uncompressed_size(&self) -> usize {
self.iter()
.map(|item| item.uncompressed_size())
.sum::<usize>()
}
}

// TODO: Update once feature #89379 (array_from_fn) is stabilized
impl<T: CanonicalDeserialize, const N: usize> CanonicalDeserialize for [T; N] {
#[inline]
fn deserialize<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
Ok([(); N].map(|_| T::deserialize(&mut reader).unwrap()))
}

#[inline]
fn deserialize_uncompressed<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
Ok([(); N].map(|_| T::deserialize_uncompressed(&mut reader).unwrap()))
}

#[inline]
fn deserialize_unchecked<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
Ok([(); N].map(|_| T::deserialize_unchecked(&mut reader).unwrap()))
}
}

impl<T: CanonicalSerialize> CanonicalSerialize for Vec<T> {
#[inline]
fn serialize<W: Write>(&self, writer: W) -> Result<(), SerializationError> {
Expand Down Expand Up @@ -884,17 +942,17 @@ mod test {
&self,
mut writer: W,
) -> Result<(), SerializationError> {
(&[100u8, 200u8]).serialize_uncompressed(&mut writer)
[100u8, 200u8].serialize_uncompressed(&mut writer)
}

#[inline]
fn uncompressed_size(&self) -> usize {
(&[100u8, 200u8]).uncompressed_size()
[100u8, 200u8].uncompressed_size()
}

#[inline]
fn serialize_unchecked<W: Write>(&self, mut writer: W) -> Result<(), SerializationError> {
(&[100u8, 200u8]).serialize_unchecked(&mut writer)
[100u8, 200u8].serialize_unchecked(&mut writer)
}
}

Expand All @@ -908,16 +966,16 @@ mod test {

#[inline]
fn deserialize_uncompressed<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
let result = Vec::<u8>::deserialize_uncompressed(&mut reader)?;
assert_eq!(result.as_slice(), &[100u8, 200u8]);
let result = <[u8; 2]>::deserialize_uncompressed(&mut reader)?;
assert_eq!(result, [100u8, 200u8]);

Ok(Dummy)
}

#[inline]
fn deserialize_unchecked<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
let result = Vec::<u8>::deserialize_unchecked(&mut reader)?;
assert_eq!(result.as_slice(), &[100u8, 200u8]);
let result = <[u8; 2]>::deserialize_unchecked(&mut reader)?;
assert_eq!(result, [100u8, 200u8]);

Ok(Dummy)
}
Expand Down Expand Up @@ -996,6 +1054,12 @@ mod test {
assert!(de.is_err());
}

#[test]
fn test_array() {
test_serialize([1u64, 2, 3, 4, 5]);
test_serialize([1u8; 33]);
}

#[test]
fn test_vec() {
test_serialize(vec![1u64, 2, 3, 4, 5]);
Expand Down

0 comments on commit edea6bb

Please sign in to comment.